123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992 |
- /*
- ==============================================================================
- This file is part of the juce_core module of the JUCE library.
- Copyright (c) 2015 - ROLI Ltd.
- Permission to use, copy, modify, and/or distribute this software for any purpose with
- or without fee is hereby granted, provided that the above copyright notice and this
- permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
- TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
- NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
- IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- ------------------------------------------------------------------------------
- NOTE! This permissive ISC license applies ONLY to files within the juce_core module!
- All other JUCE modules are covered by a dual GPL/commercial license, so if you are
- using any other modules, be sure to check that you also comply with their license.
- For more details, visit www.juce.com
- ==============================================================================
- */
- #ifndef JUCE_FILE_H_INCLUDED
- #define JUCE_FILE_H_INCLUDED
- //==============================================================================
- /**
- Represents a local file or directory.
- This class encapsulates the absolute pathname of a file or directory, and
- has methods for finding out about the file and changing its properties.
- To read or write to the file, there are methods for returning an input or
- output stream.
- @see FileInputStream, FileOutputStream
- */
- class JUCE_API File
- {
- public:
- //==============================================================================
- /** Creates an (invalid) file object.
- The file is initially set to an empty path, so getFullPathName() will return
- an empty string, and comparing the file to File::nonexistent will return
- true.
- You can use its operator= method to point it at a proper file.
- */
- File() noexcept {}
- /** Creates a file from an absolute path.
- If the path supplied is a relative path, it is taken to be relative
- to the current working directory (see File::getCurrentWorkingDirectory()),
- but this isn't a recommended way of creating a file, because you
- never know what the CWD is going to be.
- On the Mac/Linux, the path can include "~" notation for referring to
- user home directories.
- */
- File (const String& absolutePath);
- /** Creates a copy of another file object. */
- File (const File&);
- /** Destructor. */
- ~File() noexcept {}
- /** Sets the file based on an absolute pathname.
- If the path supplied is a relative path, it is taken to be relative
- to the current working directory (see File::getCurrentWorkingDirectory()),
- but this isn't a recommended way of creating a file, because you
- never know what the CWD is going to be.
- On the Mac/Linux, the path can include "~" notation for referring to
- user home directories.
- */
- File& operator= (const String& newAbsolutePath);
- /** Copies from another file object. */
- File& operator= (const File& otherFile);
- #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
- File (File&&) noexcept;
- File& operator= (File&&) noexcept;
- #endif
- //==============================================================================
- /** This static constant is used for referring to an 'invalid' file. */
- static const File nonexistent;
- //==============================================================================
- /** Checks whether the file actually exists.
- @returns true if the file exists, either as a file or a directory.
- @see existsAsFile, isDirectory
- */
- bool exists() const;
- /** Checks whether the file exists and is a file rather than a directory.
- @returns true only if this is a real file, false if it's a directory
- or doesn't exist
- @see exists, isDirectory
- */
- bool existsAsFile() const;
- /** Checks whether the file is a directory that exists.
- @returns true only if the file is a directory which actually exists, so
- false if it's a file or doesn't exist at all
- @see exists, existsAsFile
- */
- bool isDirectory() const;
- /** Returns the size of the file in bytes.
- @returns the number of bytes in the file, or 0 if it doesn't exist.
- */
- int64 getSize() const;
- /** Utility function to convert a file size in bytes to a neat string description.
- So for example 100 would return "100 bytes", 2000 would return "2 KB",
- 2000000 would produce "2 MB", etc.
- */
- static String descriptionOfSizeInBytes (int64 bytes);
- //==============================================================================
- /** Returns the complete, absolute path of this file.
- This includes the filename and all its parent folders. On Windows it'll
- also include the drive letter prefix; on Mac or Linux it'll be a complete
- path starting from the root folder.
- If you just want the file's name, you should use getFileName() or
- getFileNameWithoutExtension().
- @see getFileName, getRelativePathFrom
- */
- const String& getFullPathName() const noexcept { return fullPath; }
- /** Returns the last section of the pathname.
- Returns just the final part of the path - e.g. if the whole path
- is "/moose/fish/foo.txt" this will return "foo.txt".
- For a directory, it returns the final part of the path - e.g. for the
- directory "/moose/fish" it'll return "fish".
- If the filename begins with a dot, it'll return the whole filename, e.g. for
- "/moose/.fish", it'll return ".fish"
- @see getFullPathName, getFileNameWithoutExtension
- */
- String getFileName() const;
- /** Creates a relative path that refers to a file relatively to a given directory.
- e.g. File ("/moose/foo.txt").getRelativePathFrom (File ("/moose/fish/haddock"))
- would return "../../foo.txt".
- If it's not possible to navigate from one file to the other, an absolute
- path is returned. If the paths are invalid, an empty string may also be
- returned.
- @param directoryToBeRelativeTo the directory which the resultant string will
- be relative to. If this is actually a file rather than
- a directory, its parent directory will be used instead.
- If it doesn't exist, it's assumed to be a directory.
- @see getChildFile, isAbsolutePath
- */
- String getRelativePathFrom (const File& directoryToBeRelativeTo) const;
- //==============================================================================
- /** Returns the file's extension.
- Returns the file extension of this file, also including the dot.
- e.g. "/moose/fish/foo.txt" would return ".txt"
- @see hasFileExtension, withFileExtension, getFileNameWithoutExtension
- */
- String getFileExtension() const;
- /** Checks whether the file has a given extension.
- @param extensionToTest the extension to look for - it doesn't matter whether or
- not this string has a dot at the start, so ".wav" and "wav"
- will have the same effect. To compare with multiple extensions, this
- parameter can contain multiple strings, separated by semi-colons -
- so, for example: hasFileExtension (".jpeg;png;gif") would return
- true if the file has any of those three extensions.
- @see getFileExtension, withFileExtension, getFileNameWithoutExtension
- */
- bool hasFileExtension (StringRef extensionToTest) const;
- /** Returns a version of this file with a different file extension.
- e.g. File ("/moose/fish/foo.txt").withFileExtension ("html") returns "/moose/fish/foo.html"
- @param newExtension the new extension, either with or without a dot at the start (this
- doesn't make any difference). To get remove a file's extension altogether,
- pass an empty string into this function.
- @see getFileName, getFileExtension, hasFileExtension, getFileNameWithoutExtension
- */
- File withFileExtension (StringRef newExtension) const;
- /** Returns the last part of the filename, without its file extension.
- e.g. for "/moose/fish/foo.txt" this will return "foo".
- @see getFileName, getFileExtension, hasFileExtension, withFileExtension
- */
- String getFileNameWithoutExtension() const;
- //==============================================================================
- /** Returns a 32-bit hash-code that identifies this file.
- This is based on the filename. Obviously it's possible, although unlikely, that
- two files will have the same hash-code.
- */
- int hashCode() const;
- /** Returns a 64-bit hash-code that identifies this file.
- This is based on the filename. Obviously it's possible, although unlikely, that
- two files will have the same hash-code.
- */
- int64 hashCode64() const;
- //==============================================================================
- /** Returns a file that represents a relative (or absolute) sub-path of the current one.
- This will find a child file or directory of the current object.
- e.g.
- File ("/moose/fish").getChildFile ("foo.txt") will produce "/moose/fish/foo.txt".
- File ("/moose/fish").getChildFile ("haddock/foo.txt") will produce "/moose/fish/haddock/foo.txt".
- File ("/moose/fish").getChildFile ("../foo.txt") will produce "/moose/foo.txt".
- If the string is actually an absolute path, it will be treated as such, e.g.
- File ("/moose/fish").getChildFile ("/foo.txt") will produce "/foo.txt"
- @see getSiblingFile, getParentDirectory, getRelativePathFrom, isAChildOf
- */
- File getChildFile (StringRef relativeOrAbsolutePath) const;
- /** Returns a file which is in the same directory as this one.
- This is equivalent to getParentDirectory().getChildFile (name).
- @see getChildFile, getParentDirectory
- */
- File getSiblingFile (StringRef siblingFileName) const;
- //==============================================================================
- /** Returns the directory that contains this file or directory.
- e.g. for "/moose/fish/foo.txt" this will return "/moose/fish".
- */
- File getParentDirectory() const;
- /** Checks whether a file is somewhere inside a directory.
- Returns true if this file is somewhere inside a subdirectory of the directory
- that is passed in. Neither file actually has to exist, because the function
- just checks the paths for similarities.
- e.g. File ("/moose/fish/foo.txt").isAChildOf ("/moose") is true.
- File ("/moose/fish/foo.txt").isAChildOf ("/moose/fish") is also true.
- */
- bool isAChildOf (const File& potentialParentDirectory) const;
- //==============================================================================
- /** Chooses a filename relative to this one that doesn't already exist.
- If this file is a directory, this will return a child file of this
- directory that doesn't exist, by adding numbers to a prefix and suffix until
- it finds one that isn't already there.
- If the prefix + the suffix doesn't exist, it won't bother adding a number.
- e.g. File ("/moose/fish").getNonexistentChildFile ("foo", ".txt", true) might
- return "/moose/fish/foo(2).txt" if there's already a file called "foo.txt".
- @param prefix the string to use for the filename before the number
- @param suffix the string to add to the filename after the number
- @param putNumbersInBrackets if true, this will create filenames in the
- format "prefix(number)suffix", if false, it will leave the
- brackets out.
- */
- File getNonexistentChildFile (const String& prefix,
- const String& suffix,
- bool putNumbersInBrackets = true) const;
- /** Chooses a filename for a sibling file to this one that doesn't already exist.
- If this file doesn't exist, this will just return itself, otherwise it
- will return an appropriate sibling that doesn't exist, e.g. if a file
- "/moose/fish/foo.txt" exists, this might return "/moose/fish/foo(2).txt".
- @param putNumbersInBrackets whether to add brackets around the numbers that
- get appended to the new filename.
- */
- File getNonexistentSibling (bool putNumbersInBrackets = true) const;
- //==============================================================================
- /** Compares the pathnames for two files. */
- bool operator== (const File&) const;
- /** Compares the pathnames for two files. */
- bool operator!= (const File&) const;
- /** Compares the pathnames for two files. */
- bool operator< (const File&) const;
- /** Compares the pathnames for two files. */
- bool operator> (const File&) const;
- //==============================================================================
- /** Checks whether a file can be created or written to.
- @returns true if it's possible to create and write to this file. If the file
- doesn't already exist, this will check its parent directory to
- see if writing is allowed.
- @see setReadOnly
- */
- bool hasWriteAccess() const;
- /** Changes the write-permission of a file or directory.
- @param shouldBeReadOnly whether to add or remove write-permission
- @param applyRecursively if the file is a directory and this is true, it will
- recurse through all the subfolders changing the permissions
- of all files
- @returns true if it manages to change the file's permissions.
- @see hasWriteAccess
- */
- bool setReadOnly (bool shouldBeReadOnly,
- bool applyRecursively = false) const;
- /** Changes the execute-permissions of a file.
- @param shouldBeExecutable whether to add or remove execute-permission
- @returns true if it manages to change the file's permissions.
- */
- bool setExecutePermission (bool shouldBeExecutable) const;
- /** Returns true if this file is a hidden or system file.
- The criteria for deciding whether a file is hidden are platform-dependent.
- */
- bool isHidden() const;
- /** Returns a unique identifier for the file, if one is available.
- Depending on the OS and file-system, this may be a unix inode number or
- a win32 file identifier, or 0 if it fails to find one. The number will
- be unique on the filesystem, but not globally.
- */
- uint64 getFileIdentifier() const;
- //==============================================================================
- /** Returns the last modification time of this file.
- @returns the time, or an invalid time if the file doesn't exist.
- @see setLastModificationTime, getLastAccessTime, getCreationTime
- */
- Time getLastModificationTime() const;
- /** Returns the last time this file was accessed.
- @returns the time, or an invalid time if the file doesn't exist.
- @see setLastAccessTime, getLastModificationTime, getCreationTime
- */
- Time getLastAccessTime() const;
- /** Returns the time that this file was created.
- @returns the time, or an invalid time if the file doesn't exist.
- @see getLastModificationTime, getLastAccessTime
- */
- Time getCreationTime() const;
- /** Changes the modification time for this file.
- @param newTime the time to apply to the file
- @returns true if it manages to change the file's time.
- @see getLastModificationTime, setLastAccessTime, setCreationTime
- */
- bool setLastModificationTime (Time newTime) const;
- /** Changes the last-access time for this file.
- @param newTime the time to apply to the file
- @returns true if it manages to change the file's time.
- @see getLastAccessTime, setLastModificationTime, setCreationTime
- */
- bool setLastAccessTime (Time newTime) const;
- /** Changes the creation date for this file.
- @param newTime the time to apply to the file
- @returns true if it manages to change the file's time.
- @see getCreationTime, setLastModificationTime, setLastAccessTime
- */
- bool setCreationTime (Time newTime) const;
- /** If possible, this will try to create a version string for the given file.
- The OS may be able to look at the file and give a version for it - e.g. with
- executables, bundles, dlls, etc. If no version is available, this will
- return an empty string.
- */
- String getVersion() const;
- //==============================================================================
- /** Creates an empty file if it doesn't already exist.
- If the file that this object refers to doesn't exist, this will create a file
- of zero size.
- If it already exists or is a directory, this method will do nothing.
- @returns a result to indicate whether the file was created successfully,
- or an error message if it failed.
- @see createDirectory
- */
- Result create() const;
- /** Creates a new directory for this filename.
- This will try to create the file as a directory, and will also create
- any parent directories it needs in order to complete the operation.
- @returns a result to indicate whether the directory was created successfully, or
- an error message if it failed.
- @see create
- */
- Result createDirectory() const;
- /** Deletes a file.
- If this file is actually a directory, it may not be deleted correctly if it
- contains files. See deleteRecursively() as a better way of deleting directories.
- @returns true if the file has been successfully deleted (or if it didn't exist to
- begin with).
- @see deleteRecursively
- */
- bool deleteFile() const;
- /** Deletes a file or directory and all its subdirectories.
- If this file is a directory, this will try to delete it and all its subfolders. If
- it's just a file, it will just try to delete the file.
- @returns true if the file and all its subfolders have been successfully deleted
- (or if it didn't exist to begin with).
- @see deleteFile
- */
- bool deleteRecursively() const;
- /** Moves this file or folder to the trash.
- @returns true if the operation succeeded. It could fail if the trash is full, or
- if the file is write-protected, so you should check the return value
- and act appropriately.
- */
- bool moveToTrash() const;
- /** Moves or renames a file.
- Tries to move a file to a different location.
- If the target file already exists, this will attempt to delete it first, and
- will fail if this can't be done.
- Note that the destination file isn't the directory to put it in, it's the actual
- filename that you want the new file to have.
- Also note that on some OSes (e.g. Windows), moving files between different
- volumes may not be possible.
- @returns true if the operation succeeds
- */
- bool moveFileTo (const File& targetLocation) const;
- /** Copies a file.
- Tries to copy a file to a different location.
- If the target file already exists, this will attempt to delete it first, and
- will fail if this can't be done.
- @returns true if the operation succeeds
- */
- bool copyFileTo (const File& targetLocation) const;
- /** Copies a directory.
- Tries to copy an entire directory, recursively.
- If this file isn't a directory or if any target files can't be created, this
- will return false.
- @param newDirectory the directory that this one should be copied to. Note that this
- is the name of the actual directory to create, not the directory
- into which the new one should be placed, so there must be enough
- write privileges to create it if it doesn't exist. Any files inside
- it will be overwritten by similarly named ones that are copied.
- */
- bool copyDirectoryTo (const File& newDirectory) const;
- //==============================================================================
- /** Used in file searching, to specify whether to return files, directories, or both.
- */
- enum TypesOfFileToFind
- {
- findDirectories = 1, /**< Use this flag to indicate that you want to find directories. */
- findFiles = 2, /**< Use this flag to indicate that you want to find files. */
- findFilesAndDirectories = 3, /**< Use this flag to indicate that you want to find both files and directories. */
- ignoreHiddenFiles = 4 /**< Add this flag to avoid returning any hidden files in the results. */
- };
- /** Searches inside a directory for files matching a wildcard pattern.
- Assuming that this file is a directory, this method will search it
- for either files or subdirectories whose names match a filename pattern.
- @param results an array to which File objects will be added for the
- files that the search comes up with
- @param whatToLookFor a value from the TypesOfFileToFind enum, specifying whether to
- return files, directories, or both. If the ignoreHiddenFiles flag
- is also added to this value, hidden files won't be returned
- @param searchRecursively if true, all subdirectories will be recursed into to do
- an exhaustive search
- @param wildCardPattern the filename pattern to search for, e.g. "*.txt"
- @returns the number of results that have been found
- @see getNumberOfChildFiles, DirectoryIterator
- */
- int findChildFiles (Array<File>& results,
- int whatToLookFor,
- bool searchRecursively,
- const String& wildCardPattern = "*") const;
- /** Searches inside a directory and counts how many files match a wildcard pattern.
- Assuming that this file is a directory, this method will search it
- for either files or subdirectories whose names match a filename pattern,
- and will return the number of matches found.
- This isn't a recursive call, and will only search this directory, not
- its children.
- @param whatToLookFor a value from the TypesOfFileToFind enum, specifying whether to
- count files, directories, or both. If the ignoreHiddenFiles flag
- is also added to this value, hidden files won't be counted
- @param wildCardPattern the filename pattern to search for, e.g. "*.txt"
- @returns the number of matches found
- @see findChildFiles, DirectoryIterator
- */
- int getNumberOfChildFiles (int whatToLookFor,
- const String& wildCardPattern = "*") const;
- /** Returns true if this file is a directory that contains one or more subdirectories.
- @see isDirectory, findChildFiles
- */
- bool containsSubDirectories() const;
- //==============================================================================
- /** Creates a stream to read from this file.
- @returns a stream that will read from this file (initially positioned at the
- start of the file), or nullptr if the file can't be opened for some reason
- @see createOutputStream, loadFileAsData
- */
- FileInputStream* createInputStream() const;
- /** Creates a stream to write to this file.
- If the file exists, the stream that is returned will be positioned ready for
- writing at the end of the file, so you might want to use deleteFile() first
- to write to an empty file.
- @returns a stream that will write to this file (initially positioned at the
- end of the file), or nullptr if the file can't be opened for some reason
- @see createInputStream, appendData, appendText
- */
- FileOutputStream* createOutputStream (size_t bufferSize = 0x8000) const;
- //==============================================================================
- /** Loads a file's contents into memory as a block of binary data.
- Of course, trying to load a very large file into memory will blow up, so
- it's better to check first.
- @param result the data block to which the file's contents should be appended - note
- that if the memory block might already contain some data, you
- might want to clear it first
- @returns true if the file could all be read into memory
- */
- bool loadFileAsData (MemoryBlock& result) const;
- /** Reads a file into memory as a string.
- Attempts to load the entire file as a zero-terminated string.
- This makes use of InputStream::readEntireStreamAsString, which can
- read either UTF-16 or UTF-8 file formats.
- */
- String loadFileAsString() const;
- /** Reads the contents of this file as text and splits it into lines, which are
- appended to the given StringArray.
- */
- void readLines (StringArray& destLines) const;
- //==============================================================================
- /** Appends a block of binary data to the end of the file.
- This will try to write the given buffer to the end of the file.
- @returns false if it can't write to the file for some reason
- */
- bool appendData (const void* dataToAppend,
- size_t numberOfBytes) const;
- /** Replaces this file's contents with a given block of data.
- This will delete the file and replace it with the given data.
- A nice feature of this method is that it's safe - instead of deleting
- the file first and then re-writing it, it creates a new temporary file,
- writes the data to that, and then moves the new file to replace the existing
- file. This means that if the power gets pulled out or something crashes,
- you're a lot less likely to end up with a corrupted or unfinished file..
- Returns true if the operation succeeds, or false if it fails.
- @see appendText
- */
- bool replaceWithData (const void* dataToWrite,
- size_t numberOfBytes) const;
- /** Appends a string to the end of the file.
- This will try to append a text string to the file, as either 16-bit unicode
- or 8-bit characters in the default system encoding.
- It can also write the 'ff fe' unicode header bytes before the text to indicate
- the endianness of the file.
- Any single \\n characters in the string are replaced with \\r\\n before it is written.
- @see replaceWithText
- */
- bool appendText (const String& textToAppend,
- bool asUnicode = false,
- bool writeUnicodeHeaderBytes = false) const;
- /** Replaces this file's contents with a given text string.
- This will delete the file and replace it with the given text.
- A nice feature of this method is that it's safe - instead of deleting
- the file first and then re-writing it, it creates a new temporary file,
- writes the text to that, and then moves the new file to replace the existing
- file. This means that if the power gets pulled out or something crashes,
- you're a lot less likely to end up with an empty file..
- For an explanation of the parameters here, see the appendText() method.
- Returns true if the operation succeeds, or false if it fails.
- @see appendText
- */
- bool replaceWithText (const String& textToWrite,
- bool asUnicode = false,
- bool writeUnicodeHeaderBytes = false) const;
- /** Attempts to scan the contents of this file and compare it to another file, returning
- true if this is possible and they match byte-for-byte.
- */
- bool hasIdenticalContentTo (const File& other) const;
- //==============================================================================
- /** Creates a set of files to represent each file root.
- e.g. on Windows this will create files for "c:\", "d:\" etc according
- to which ones are available. On the Mac/Linux, this will probably
- just add a single entry for "/".
- */
- static void findFileSystemRoots (Array<File>& results);
- /** Finds the name of the drive on which this file lives.
- @returns the volume label of the drive, or an empty string if this isn't possible
- */
- String getVolumeLabel() const;
- /** Returns the serial number of the volume on which this file lives.
- @returns the serial number, or zero if there's a problem doing this
- */
- int getVolumeSerialNumber() const;
- /** Returns the number of bytes free on the drive that this file lives on.
- @returns the number of bytes free, or 0 if there's a problem finding this out
- @see getVolumeTotalSize
- */
- int64 getBytesFreeOnVolume() const;
- /** Returns the total size of the drive that contains this file.
- @returns the total number of bytes that the volume can hold
- @see getBytesFreeOnVolume
- */
- int64 getVolumeTotalSize() const;
- /** Returns true if this file is on a CD or DVD drive. */
- bool isOnCDRomDrive() const;
- /** Returns true if this file is on a hard disk.
- This will fail if it's a network drive, but will still be true for
- removable hard-disks.
- */
- bool isOnHardDisk() const;
- /** Returns true if this file is on a removable disk drive.
- This might be a usb-drive, a CD-rom, or maybe a network drive.
- */
- bool isOnRemovableDrive() const;
- //==============================================================================
- /** Launches the file as a process.
- - if the file is executable, this will run it.
- - if it's a document of some kind, it will launch the document with its
- default viewer application.
- - if it's a folder, it will be opened in Explorer, Finder, or equivalent.
- @see revealToUser
- */
- bool startAsProcess (const String& parameters = String()) const;
- /** Opens Finder, Explorer, or whatever the OS uses, to show the user this file's location.
- @see startAsProcess
- */
- void revealToUser() const;
- //==============================================================================
- /** A set of types of location that can be passed to the getSpecialLocation() method.
- */
- enum SpecialLocationType
- {
- /** The user's home folder. This is the same as using File ("~"). */
- userHomeDirectory,
- /** The user's default documents folder. On Windows, this might be the user's
- "My Documents" folder. On the Mac it'll be their "Documents" folder. Linux
- doesn't tend to have one of these, so it might just return their home folder.
- */
- userDocumentsDirectory,
- /** The folder that contains the user's desktop objects. */
- userDesktopDirectory,
- /** The most likely place where a user might store their music files. */
- userMusicDirectory,
- /** The most likely place where a user might store their movie files. */
- userMoviesDirectory,
- /** The most likely place where a user might store their picture files. */
- userPicturesDirectory,
- /** The folder in which applications store their persistent user-specific settings.
- On Windows, this might be "\Documents and Settings\username\Application Data".
- On the Mac, it might be "~/Library". If you're going to store your settings in here,
- always create your own sub-folder to put them in, to avoid making a mess.
- */
- userApplicationDataDirectory,
- /** An equivalent of the userApplicationDataDirectory folder that is shared by all users
- of the computer, rather than just the current user.
- On the Mac it'll be "/Library", on Windows, it could be something like
- "\Documents and Settings\All Users\Application Data".
- Depending on the setup, this folder may be read-only.
- */
- commonApplicationDataDirectory,
- /** A place to put documents which are shared by all users of the machine.
- On Windows this may be somewhere like "C:\Users\Public\Documents", on OSX it
- will be something like "/Users/Shared". Other OSes may have no such concept
- though, so be careful.
- */
- commonDocumentsDirectory,
- /** The folder that should be used for temporary files.
- Always delete them when you're finished, to keep the user's computer tidy!
- */
- tempDirectory,
- /** Returns this application's executable file.
- If running as a plug-in or DLL, this will (where possible) be the DLL rather than the
- host app.
- On the mac this will return the unix binary, not the package folder - see
- currentApplicationFile for that.
- See also invokedExecutableFile, which is similar, but if the exe was launched from a
- file link, invokedExecutableFile will return the name of the link.
- */
- currentExecutableFile,
- /** Returns this application's location.
- If running as a plug-in or DLL, this will (where possible) be the DLL rather than the
- host app.
- On the mac this will return the package folder (if it's in one), not the unix binary
- that's inside it - compare with currentExecutableFile.
- */
- currentApplicationFile,
- /** Returns the file that was invoked to launch this executable.
- This may differ from currentExecutableFile if the app was started from e.g. a link - this
- will return the name of the link that was used, whereas currentExecutableFile will return
- the actual location of the target executable.
- */
- invokedExecutableFile,
- /** In a plugin, this will return the path of the host executable. */
- hostApplicationPath,
- #if JUCE_WINDOWS
- /** On a Windows machine, returns the location of the Windows/System32 folder. */
- windowsSystemDirectory,
- #endif
- /** The directory in which applications normally get installed.
- So on windows, this would be something like "c:\program files", on the
- Mac "/Applications", or "/usr" on linux.
- */
- globalApplicationsDirectory
- };
- /** Finds the location of a special type of file or directory, such as a home folder or
- documents folder.
- @see SpecialLocationType
- */
- static File JUCE_CALLTYPE getSpecialLocation (const SpecialLocationType type);
- //==============================================================================
- /** Returns a temporary file in the system's temp directory.
- This will try to return the name of a non-existent temp file.
- To get the temp folder, you can use getSpecialLocation (File::tempDirectory).
- */
- static File createTempFile (StringRef fileNameEnding);
- //==============================================================================
- /** Returns the current working directory.
- @see setAsCurrentWorkingDirectory
- */
- static File getCurrentWorkingDirectory();
- /** Sets the current working directory to be this file.
- For this to work the file must point to a valid directory.
- @returns true if the current directory has been changed.
- @see getCurrentWorkingDirectory
- */
- bool setAsCurrentWorkingDirectory() const;
- //==============================================================================
- /** The system-specific file separator character.
- On Windows, this will be '\', on Mac/Linux, it'll be '/'
- */
- static const juce_wchar separator;
- /** The system-specific file separator character, as a string.
- On Windows, this will be '\', on Mac/Linux, it'll be '/'
- */
- static const String separatorString;
- //==============================================================================
- /** Returns a version of a filename with any illegal characters removed.
- This will return a copy of the given string after removing characters
- that are not allowed in a legal filename, and possibly shortening the
- string if it's too long.
- Because this will remove slashes, don't use it on an absolute pathname - use
- createLegalPathName() for that.
- @see createLegalPathName
- */
- static String createLegalFileName (const String& fileNameToFix);
- /** Returns a version of a path with any illegal characters removed.
- Similar to createLegalFileName(), but this won't remove slashes, so can
- be used on a complete pathname.
- @see createLegalFileName
- */
- static String createLegalPathName (const String& pathNameToFix);
- /** Indicates whether filenames are case-sensitive on the current operating system. */
- static bool areFileNamesCaseSensitive();
- /** Returns true if the string seems to be a fully-specified absolute path. */
- static bool isAbsolutePath (StringRef path);
- /** Creates a file that simply contains this string, without doing the sanity-checking
- that the normal constructors do.
- Best to avoid this unless you really know what you're doing.
- */
- static File createFileWithoutCheckingPath (const String& absolutePath) noexcept;
- /** Adds a separator character to the end of a path if it doesn't already have one. */
- static String addTrailingSeparator (const String& path);
- //==============================================================================
- /** Tries to create a symbolic link and returns a boolean to indicate success */
- bool createSymbolicLink (const File& linkFileToCreate, bool overwriteExisting) const;
- /** Returns true if this file is a link or alias that can be followed using getLinkedTarget(). */
- bool isSymbolicLink() const;
- /** If this file is a link or alias, this returns the file that it points to.
- If the file isn't actually link, it'll just return itself.
- */
- File getLinkedTarget() const;
- #if JUCE_WINDOWS
- /** Windows ONLY - Creates a win32 .LNK shortcut file that links to this file. */
- bool createShortcut (const String& description, const File& linkFileToCreate) const;
- /** Windows ONLY - Returns true if this is a win32 .LNK file. */
- bool isShortcut() const;
- #endif
- //==============================================================================
- #if JUCE_MAC || JUCE_IOS || DOXYGEN
- /** OSX ONLY - Finds the OSType of a file from the its resources. */
- OSType getMacOSType() const;
- /** OSX ONLY - Returns true if this file is actually a bundle. */
- bool isBundle() const;
- #endif
- #if JUCE_MAC || DOXYGEN
- /** OSX ONLY - Adds this file to the OSX dock */
- void addToDock() const;
- #endif
- private:
- //==============================================================================
- String fullPath;
- static String parseAbsolutePath (const String&);
- String getPathUpToLastSlash() const;
- Result createDirectoryInternal (const String&) const;
- bool copyInternal (const File&) const;
- bool moveInternal (const File&) const;
- bool setFileTimesInternal (int64 m, int64 a, int64 c) const;
- void getFileTimesInternal (int64& m, int64& a, int64& c) const;
- bool setFileReadOnlyInternal (bool) const;
- bool setFileExecutableInternal (bool) const;
- };
- #endif // JUCE_FILE_H_INCLUDED
|