/* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS #endif #include <sys/types.h> #include <sys/stat.h> #import "OFSeekableStream.h" @class OFArray; @class OFDate; #ifndef _WIN32 typedef struct stat of_stat_t; #else typedef struct _stat of_stat_t; #endif /*! * @class OFFile OFFile.h ObjFW/OFFile.h * * @brief A class which provides functions to read, write and manipulate files. */ @interface OFFile: OFSeekableStream { int _fd; bool _atEndOfStream; } /*! * @brief Creates a new OFFile with the specified path and mode. * * @param path The path to the file to open as a string * @param mode The mode in which the file should be opened.@n * Possible modes are: * Mode | Description * ---------------|------------------------------------- * `r` | read-only * `rb` | read-only, binary * `r+` | read-write * `rb+` or `r+b` | read-write, binary * `w` | write-only, create, truncate * `wb` | write-only, create, truncate, binary * `w` | read-write, create, truncate * `wb+` or `w+b` | read-write, create, truncate, binary * `a` | write-only, create, append * `ab` | write-only, create, append, binary * `a+` | read-write, create, append * `ab+` or `a+b` | read-write, create, append, binary * @return A new autoreleased OFFile */ + (instancetype)fileWithPath: (OFString*)path mode: (OFString*)mode; /*! * @brief Creates a new OFFile with the specified file descriptor. * * @param fd A file descriptor, returned from for example open(). * It is not closed when the OFFile object is deallocated! * @return A new autoreleased OFFile */ + (instancetype)fileWithFileDescriptor: (int)fd; /*! * @brief Returns the path fo the current working directory. * * @return The path of the current working directory */ + (OFString*)currentDirectoryPath; /*! * @brief Checks whether a file exists at the specified path. * * @param path The path to check * @return A boolean whether there is a file at the specified path */ + (bool)fileExistsAtPath: (OFString*)path; /*! * @brief Checks whether a directory exists at the specified path. * * @param path The path to check * @return A boolean whether there is a directory at the specified path */ + (bool)directoryExistsAtPath: (OFString*)path; #ifdef OF_HAVE_SYMLINK /*! * @brief Checks whether a symbolic link exists at the specified path. * * @param path The path to check * @return A boolean whether there is a symbolic link at the specified path */ + (bool)symbolicLinkExistsAtPath: (OFString*)path; #endif /*! * @brief Creates a directory at the specified path. * * @param path The path of the directory */ + (void)createDirectoryAtPath: (OFString*)path; /*! * @brief Creates a directory at the specified path. * * @param path The path of the directory * @param createParents Whether to create the parents of the directory */ + (void)createDirectoryAtPath: (OFString*)path createParents: (bool)createParents; /*! * @brief Returns an array with the items in the specified directory. * * @note `.` and `..` are not part of the returned array. * * @param path The path to the directory whose items should be returned * @return An array of OFStrings with the items in the specified directory */ + (OFArray*)contentsOfDirectoryAtPath: (OFString*)path; /*! * @brief Changes the current working directory. * * @param path The new directory to change to */ + (void)changeCurrentDirectoryPath: (OFString*)path; /*! * @brief Returns the size of the specified file. * * @return The size of the specified file */ + (off_t)sizeOfFileAtPath: (OFString*)path; /*! * @brief Returns the date of the last modification of the file. * * @return The date of the last modification of the file */ + (OFDate*)modificationDateOfFileAtPath: (OFString*)path; #ifdef OF_HAVE_CHMOD /*! * @brief Changes the permissions of an item. * * This method only changes the read-only flag on Windows. * * @param path The path to the item whose permissions should be changed * @param permissions The new permissions for the item */ + (void)changePermissionsOfItemAtPath: (OFString*)path permissions: (mode_t)permissions; #endif #ifdef OF_HAVE_CHOWN /*! * @brief Changes the owner of an item. * * This method is not available on some systems, most notably Windows. * * @param path The path to the item whose owner should be changed * @param owner The new owner for the item * @param group The new group for the item */ + (void)changeOwnerOfItemAtPath: (OFString*)path owner: (OFString*)owner group: (OFString*)group; #endif /*! * @brief Copies a file, directory or symlink (if supported by the OS). * * The destination path must be a full path, which means it must include the * name of the item. * * If an item already exists, the copy operation fails. This is also the case * if a directory is copied and an item already exists in the destination * directory. * * @param source The file, directory or symlink to copy * @param destination The destination path */ + (void)copyItemAtPath: (OFString*)source toPath: (OFString*)destination; /*! * @brief Moves an item. * * The destination path must be a full path, which means it must include the * name of the item. * * If the destination is on a different logical device, the source will be * copied to the destination using @ref copyItemAtPath:toPath: and the source * removed using @ref removeItemAtPath:. * * @param source The item to rename * @param destination The new name for the item */ + (void)moveItemAtPath: (OFString*)source toPath: (OFString*)destination; /*! * @brief Removes the item at the specified path. * * If the item at the specified path is a directory, it is removed recursively. * * @param path The path to the item which should be removed */ + (void)removeItemAtPath: (OFString*)path; #ifdef OF_HAVE_LINK /*! * @brief Creates a hard link for the specified item. * * The destination path must be a full path, which means it must include the * name of the item. * * This method is not available on some systems, most notably Windows. * * @param source The path of the item for which a link should be created * @param destination The path of the item which should link to the source */ + (void)linkItemAtPath: (OFString*)source toPath: (OFString*)destination; #endif #ifdef OF_HAVE_SYMLINK /*! * @brief Creates a symbolic link for an item. * * The destination path must be a full path, which means it must include the * name of the item. * * This method is not available on some systems, most notably Windows. * * @param destination The path of the item which should symbolically link to the * source * @param source The path of the item for which a symbolic link should be * created */ + (void)createSymbolicLinkAtPath: (OFString*)destination withDestinationPath: (OFString*)source; /*! * @brief Returns the destination of the symbolic link at the specified path. * * @param path The path to the symbolic link * @return The destination of the symbolic link at the specified path */ + (OFString*)destinationOfSymbolicLinkAtPath: (OFString*)path; #endif /*! * @brief Initializes an already allocated OFFile. * * @param path The path to the file to open as a string * @param mode The mode in which the file should be opened.@n * Possible modes are: * Mode | Description * ---------------|------------------------------------- * `r` | read-only * `rb` | read-only, binary * `r+` | read-write * `rb+` or `r+b` | read-write, binary * `w` | write-only, create, truncate * `wb` | write-only, create, truncate, binary * `w` | read-write, create, truncate * `wb+` or `w+b` | read-write, create, truncate, binary * `a` | write-only, create, append * `ab` | write-only, create, append, binary * `a+` | read-write, create, append * `ab+` or `a+b` | read-write, create, append, binary * @return An initialized OFFile */ - initWithPath: (OFString*)path mode: (OFString*)mode; /*! * @brief Initializes an already allocated OFFile. * * @param fd A file descriptor, returned from for example open(). * It is not closed when the OFFile object is deallocated! */ - initWithFileDescriptor: (int)fd; @end #ifdef __cplusplus extern "C" { #endif extern int of_stat(OFString *path, of_stat_t *buffer); extern int of_lstat(OFString *path, of_stat_t *buffer); #ifdef __cplusplus } #endif