#ifndef AWS_COMMON_FILE_H
#define AWS_COMMON_FILE_H
#include <aws/common/byte_buf.h>
#include <aws/common/common.h>
#include <aws/common/platform.h>
#include <stdio.h>
#ifdef AWS_OS_WINDOWS
# define AWS_PATH_DELIM '\\'
# define AWS_PATH_DELIM_STR "\\"
#else
# define AWS_PATH_DELIM '/'
# define AWS_PATH_DELIM_STR "/"
#endif
struct aws_string;
struct aws_directory_iterator;
enum aws_file_type {
AWS_FILE_TYPE_FILE = 1,
AWS_FILE_TYPE_SYM_LINK = 2,
AWS_FILE_TYPE_DIRECTORY = 4,
};
struct aws_directory_entry {
struct aws_byte_cursor path;
struct aws_byte_cursor relative_path;
int file_type;
int64_t file_size;
};
typedef bool(aws_on_directory_entry)(const struct aws_directory_entry *entry, void *user_data);
AWS_EXTERN_C_BEGIN
AWS_COMMON_API FILE *aws_fopen(const char *file_path, const char *mode);
AWS_COMMON_API FILE *aws_fopen_safe(const struct aws_string *file_path, const struct aws_string *mode);
AWS_COMMON_API int aws_directory_create(const struct aws_string *dir_path);
AWS_COMMON_API bool aws_directory_exists(const struct aws_string *dir_path);
AWS_COMMON_API int aws_directory_delete(const struct aws_string *dir_path, bool recursive);
AWS_COMMON_API int aws_file_delete(const struct aws_string *file_path);
AWS_COMMON_API int aws_directory_or_file_move(const struct aws_string *from, const struct aws_string *to);
AWS_COMMON_API int aws_directory_traverse(
struct aws_allocator *allocator,
const struct aws_string *path,
bool recursive,
aws_on_directory_entry *on_entry,
void *user_data);
AWS_COMMON_API struct aws_directory_iterator *aws_directory_entry_iterator_new(
struct aws_allocator *allocator,
const struct aws_string *path);
AWS_COMMON_API int aws_directory_entry_iterator_next(struct aws_directory_iterator *iterator);
AWS_COMMON_API int aws_directory_entry_iterator_previous(struct aws_directory_iterator *iterator);
AWS_COMMON_API void aws_directory_entry_iterator_destroy(struct aws_directory_iterator *iterator);
AWS_COMMON_API const struct aws_directory_entry *aws_directory_entry_iterator_get_value(
const struct aws_directory_iterator *iterator);
AWS_COMMON_API
bool aws_is_any_directory_separator(char value);
AWS_COMMON_API
char aws_get_platform_directory_separator(void);
AWS_COMMON_API
struct aws_string *aws_get_home_directory(struct aws_allocator *allocator);
AWS_COMMON_API
bool aws_path_exists(const struct aws_string *path);
AWS_COMMON_API
int aws_fseek(FILE *file, int64_t offset, int whence);
AWS_COMMON_API
int aws_file_get_length(FILE *file, int64_t *length);
AWS_EXTERN_C_END
#endif