39 : fullPath (
other.fullPath)
45 fullPath = parseAbsolutePath (
newPath);
51 fullPath =
other.fullPath;
56 : fullPath (std::move (
other.fullPath))
62 fullPath = std::move (
other.fullPath);
66JUCE_DECLARE_DEPRECATED_STATIC (
const File File::nonexistent{};)
69static String removeEllipsis (
const String& path)
74 if (path.contains (
".\\"))
76 if (path.contains (
"./"))
81 bool anythingChanged =
false;
83 for (
int i = 1; i < toks.size(); ++i)
87 if (t ==
".." && toks[i - 1] !=
"..")
89 anythingChanged =
true;
95 anythingChanged =
true;
137 else if (! path.containsChar (
':'))
158 auto path = removeEllipsis (p);
160 if (path.startsWithChar (
'~'))
166 + path.substring (1);
171 auto userName = path.substring (1).upToFirstOccurrenceOf (
"/",
false,
false);
173 if (
auto* pw = getpwnam (userName.toUTF8()))
179 #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS
180 if (! (path.startsWith (
"./") || path.startsWith (
"../")))
191 #if JUCE_LOG_ASSERTIONS
202 path = path.dropLastCharacters (1);
215 #define NAMES_ARE_CASE_SENSITIVE 1
220 #if NAMES_ARE_CASE_SENSITIVE
229 #if NAMES_ARE_CASE_SENSITIVE
272 if (
newFile.fullPath == fullPath)
278 #if ! NAMES_ARE_CASE_SENSITIVE
295 if (
newFile.fullPath == fullPath)
301 if (! replaceInternal (
newFile))
313 if (! f.copyFileTo (
newDirectory.getChildFile (f.getFileName())))
317 if (! f.copyDirectoryTo (
newDirectory.getChildFile (f.getFileName())))
327String File::getPathUpToLastSlash()
const
367 auto ourPath = getPathUpToLastSlash();
406 auto path = fullPath;
447 path.appendCharPointer (r);
536 return in.openedOk() ?
in.readEntireStreamAsString()
559 results.
add (
di.getFile());
588 bool putNumbersInBrackets)
const
598 if (
prefix.trim().endsWithChar (
')'))
600 putNumbersInBrackets =
true;
618 if (putNumbersInBrackets)
620 newName <<
'(' << ++
number <<
')';
632 }
while (f.exists());
645 putNumbersInBrackets);
678 return fullPath[
dotPos] ==
'.';
714 return fin.release();
748 return tempFile.overwriteTargetFileWithTemporary();
755 if (
out.failedToOpen())
765 return tempFile.overwriteTargetFileWithTemporary();
777 if (
in1.openedOk() &&
in2.openedOk())
779 const int bufferSize = 4096;
808 if (
s.isNotEmpty() &&
s[1] ==
':')
810 start =
s.substring (0, 2);
814 return start +
s.removeCharacters (
"\"#@,;:<>*^|?")
815 .substring (0, 1024);
820 auto s =
original.removeCharacters (
"\"#@,;:<>*^|?\\/");
823 auto len =
s.length();
827 auto lastDot =
s.lastIndexOfChar (
'.');
850 auto c =
s.getAndAdvance();
888 #if NAMES_ARE_CASE_SENSITIVE
956 #if JUCE_MAC || JUCE_LINUX
995 : range (0, file.getSize())
1001 : range (
fileRange.getIntersectionWith (
Range<int64> (0, file.getSize())))
1015 void runTest()
override
1017 beginTest (
"Reading");
1022 expect (! File().exists());
1023 expect (! File().existsAsFile());
1024 expect (! File().isDirectory());
1026 expect (File(
"/").isDirectory());
1028 expect (
home.isDirectory());
1029 expect (
home.exists());
1030 expect (!
home.existsAsFile());
1036 expect (
home.getVolumeTotalSize() > 1024 * 1024);
1037 expect (
home.getBytesFreeOnVolume() > 0);
1038 expect (!
home.isHidden());
1039 expect (
home.isOnHardDisk());
1040 expect (!
home.isOnCDRomDrive());
1042 expect (
home.setAsCurrentWorkingDirectory());
1048 expect (
roots.size() > 0);
1051 for (
int i = 0; i <
roots.size(); ++i)
1052 if (
roots[i].exists())
1059 beginTest (
"Writing");
1061 File
demoFolder (
temp.getChildFile (
"JUCE UnitTests Temp Folder.folder"));
1066 expect (
temp.isDirectory());
1072 expect (
tempFile.getFileExtension() ==
".txt");
1073 expect (
tempFile.hasFileExtension (
".txt"));
1074 expect (
tempFile.hasFileExtension (
"txt"));
1075 expect (
tempFile.withFileExtension (
"xyz").hasFileExtension (
".xyz"));
1076 expect (
tempFile.withFileExtension (
"xyz").hasFileExtension (
"abc;xyz;foo"));
1077 expect (
tempFile.withFileExtension (
"xyz").hasFileExtension (
"xyz;foo"));
1078 expect (!
tempFile.withFileExtension (
"h").hasFileExtension (
"bar;foo;xx"));
1079 expect (
tempFile.getSiblingFile (
"foo").isAChildOf (
temp));
1080 expect (
tempFile.hasWriteAccess());
1082 expect (
home.getChildFile (
".") ==
home);
1083 expect (
home.getChildFile (
"..") ==
home.getParentDirectory());
1084 expect (
home.getChildFile (
".xyz").getFileName() ==
".xyz");
1085 expect (
home.getChildFile (
"..xyz").getFileName() ==
"..xyz");
1086 expect (
home.getChildFile (
"...xyz").getFileName() ==
"...xyz");
1087 expect (
home.getChildFile (
"./xyz") ==
home.getChildFile (
"xyz"));
1088 expect (
home.getChildFile (
"././xyz") ==
home.getChildFile (
"xyz"));
1089 expect (
home.getChildFile (
"../xyz") ==
home.getParentDirectory().getChildFile (
"xyz"));
1090 expect (
home.getChildFile (
".././xyz") ==
home.getParentDirectory().getChildFile (
"xyz"));
1091 expect (
home.getChildFile (
".././xyz/./abc") ==
home.getParentDirectory().getChildFile (
"xyz/abc"));
1092 expect (
home.getChildFile (
"./../xyz") ==
home.getParentDirectory().getChildFile (
"xyz"));
1093 expect (
home.getChildFile (
"a1/a2/a3/./../../a4") ==
home.getChildFile (
"a1/a4"));
1097 fo.write (
"0123456789", 10);
1103 expectEquals (
tempFile.loadFileAsString(), String (
"0123456789"));
1104 expect (!
demoFolder.containsSubDirectories());
1112 demoFolder.getNonexistentChildFile (
"tempFolder",
"",
false).createDirectory();
1115 expect (
demoFolder.containsSubDirectories());
1117 expect (
tempFile.hasWriteAccess());
1119 expect (!
tempFile.hasWriteAccess());
1121 expect (
tempFile.hasWriteAccess());
1125 Time
t2 =
tempFile.getLastModificationTime();
1126 expect (std::abs ((
int) (
t2.toMilliseconds() -
t.toMilliseconds())) <= 1000);
1131 expect (
mb.getSize() == 10);
1132 expect (
mb[0] ==
'0');
1138 expect (
fo.openedOk());
1140 expect (
fo.setPosition (7));
1141 expect (
fo.truncate().wasOk());
1143 fo.write (
"789", 3);
1148 beginTest (
"Memory-mapped files");
1152 expect (
mmf.getSize() == 10);
1153 expect (
mmf.getData() !=
nullptr);
1154 expect (
memcmp (
mmf.getData(),
"0123456789", 10) == 0);
1160 expect (
tempFile2.appendData (
"xxxxxxxxxx", 10));
1164 expect (
mmf.getSize() == 10);
1165 expect (
mmf.getData() !=
nullptr);
1166 memcpy (
mmf.getData(),
"abcdefghij", 10);
1171 expect (
mmf.getSize() == 10);
1172 expect (
mmf.getData() !=
nullptr);
1173 expect (
memcmp (
mmf.getData(),
"abcdefghij", 10) == 0);
1179 beginTest (
"More writing");
1181 expect (
tempFile.appendData (
"abcdefghij", 10));
1183 expect (
tempFile.replaceWithData (
"abcdefghij", 10));
1201static FileTests fileUnitTests;
Holds a resizable array of primitive or copy-by-value objects.
bool isEmpty() const noexcept
Returns true if the array is empty, false otherwise.
void removeRange(int startIndex, int numberToRemove)
Removes a range of elements from the array.
Array()=default
Creates an empty array.
int indexOf(ParameterType elementToLookFor) const
Finds the index of the first element which matches the value passed in.
void add(const ElementType &newElement)
Appends a new element at the end of the array.
Wraps a pointer to a null-terminated UTF-8 character string, and provides various methods to operate ...
static juce_wchar toLowerCase(juce_wchar character) noexcept
Converts a character to lower-case.
static bool isDigit(char character) noexcept
Checks whether a character is a digit.
Searches through the files in a directory, returning each file that is found.
An output stream that writes into a local file.
Represents a local file or directory.
bool replaceWithText(const String &textToWrite, bool asUnicode=false, bool writeUnicodeHeaderBytes=false, const char *lineEndings="\r\n") const
Replaces this file's contents with a given text string.
bool isSymbolicLink() const
Returns true if this file is a link or alias that can be followed using getLinkedTarget().
int getNumberOfChildFiles(int whatToLookFor, const String &wildCardPattern="*") const
Searches inside a directory and counts how many files match a wildcard pattern.
bool moveFileTo(const File &targetLocation) const
Moves or renames a file.
bool operator==(const File &) const
Compares the pathnames for two files.
int64 hashCode64() const
Returns a 64-bit hash-code that identifies this file.
bool containsSubDirectories() const
Returns true if this file is a directory that contains one or more subdirectories.
bool isDirectory() const
Checks whether the file is a directory that exists.
static void findFileSystemRoots(Array< File > &results)
Creates a set of files to represent each file root.
bool hasIdenticalContentTo(const File &other) const
Attempts to scan the contents of this file and compare it to another file, returning true if this is ...
FileOutputStream * createOutputStream(size_t bufferSize=0x8000) const
Creates a stream to write to this file.
static String createLegalPathName(const String &pathNameToFix)
Returns a version of a path with any illegal characters removed.
static String addTrailingSeparator(const String &path)
Adds a separator character to the end of a path if it doesn't already have one.
String getFileExtension() const
Returns the file's extension.
Time getLastModificationTime() const
Returns the last modification time of this file.
bool existsAsFile() const
Checks whether the file exists and is a file rather than a directory.
bool copyFileTo(const File &targetLocation) const
Copies a file.
int64 getSize() const
Returns the size of the file in bytes.
bool deleteRecursively(bool followSymlinks=false) const
Deletes a file or directory and all its subdirectories.
static File JUCE_CALLTYPE getSpecialLocation(const SpecialLocationType type)
Finds the location of a special type of file or directory, such as a home folder or documents folder.
const String & getFullPathName() const noexcept
Returns the complete, absolute path of this file.
String getFileName() const
Returns the last section of the pathname.
bool replaceWithData(const void *dataToWrite, size_t numberOfBytes) const
Replaces this file's contents with a given block of data.
bool setLastAccessTime(Time newTime) const
Changes the last-access time for this file.
File getChildFile(StringRef relativeOrAbsolutePath) const
Returns a file that represents a relative (or absolute) sub-path of the current one.
void readLines(StringArray &destLines) const
Reads the contents of this file as text and splits it into lines, which are appended to the given Str...
static bool isAbsolutePath(StringRef path)
Returns true if the string seems to be a fully-specified absolute path.
File getSiblingFile(StringRef siblingFileName) const
Returns a file which is in the same directory as this one.
bool createSymbolicLink(const File &linkFileToCreate, bool overwriteExisting) const
Tries to create a symbolic link and returns a boolean to indicate success.
String getFileNameWithoutExtension() const
Returns the last part of the filename, without its file extension.
Array< File > findChildFiles(int whatToLookFor, bool searchRecursively, const String &wildCardPattern="*") const
Searches this directory for files matching a wildcard pattern.
File getNonexistentSibling(bool putNumbersInBrackets=true) const
Chooses a filename for a sibling file to this one that doesn't already exist.
@ tempDirectory
The folder that should be used for temporary files.
@ userDocumentsDirectory
The user's default documents folder.
@ currentApplicationFile
Returns this application's location.
@ invokedExecutableFile
Returns the file that was invoked to launch this executable.
@ userApplicationDataDirectory
The folder in which applications store their persistent user-specific settings.
@ currentExecutableFile
Returns this application's executable file.
@ userHomeDirectory
The user's home folder.
String getRelativePathFrom(const File &directoryToBeRelativeTo) const
Creates a relative path that refers to a file relatively to a given directory.
bool appendText(const String &textToAppend, bool asUnicode=false, bool writeUnicodeHeaderBytes=false, const char *lineEndings="\r\n") const
Appends a string to the end of the file.
int hashCode() const
Returns a 32-bit hash-code that identifies this file.
Result create() const
Creates an empty file if it doesn't already exist.
@ findDirectories
Use this flag to indicate that you want to find directories.
@ findFilesAndDirectories
Use this flag to indicate that you want to find both files and directories.
@ findFiles
Use this flag to indicate that you want to find files.
File getNonexistentChildFile(const String &prefix, const String &suffix, bool putNumbersInBrackets=true) const
Chooses a filename relative to this one that doesn't already exist.
bool operator!=(const File &) const
Compares the pathnames for two files.
bool setCreationTime(Time newTime) const
Changes the creation date for this file.
static String descriptionOfSizeInBytes(int64 bytes)
Utility function to convert a file size in bytes to a neat string description.
bool setReadOnly(bool shouldBeReadOnly, bool applyRecursively=false) const
Changes the write-permission of a file or directory.
static File createTempFile(StringRef fileNameEnding)
Returns a temporary file in the system's temp directory.
static juce_wchar getSeparatorChar()
The system-specific file separator character.
static bool areFileNamesCaseSensitive()
Indicates whether filenames are case-sensitive on the current operating system.
bool isRoot() const
Checks whether the path of this file represents the root of a file system, irrespective of its existe...
String loadFileAsString() const
Reads a file into memory as a string.
FileInputStream * createInputStream() const
Creates a stream to read from this file.
bool operator>(const File &) const
Compares the pathnames for two files.
File getLinkedTarget() const
If this file is a link or alias, this returns the file that it points to.
File getParentDirectory() const
Returns the directory that contains this file or directory.
bool appendData(const void *dataToAppend, size_t numberOfBytes) const
Appends a block of binary data to the end of the file.
bool operator<(const File &) const
Compares the pathnames for two files.
Time getCreationTime() const
Returns the time that this file was created.
bool setExecutePermission(bool shouldBeExecutable) const
Changes the execute-permissions of a file.
File withFileExtension(StringRef newExtension) const
Returns a version of this file with a different file extension.
static String createLegalFileName(const String &fileNameToFix)
Returns a version of a filename with any illegal characters removed.
File()=default
Creates an (invalid) file object.
bool deleteFile() const
Deletes a file.
bool replaceFileIn(const File &targetLocation) const
Replaces a file.
bool isAChildOf(const File &potentialParentDirectory) const
Checks whether a file is somewhere inside a directory.
static File createFileWithoutCheckingPath(const String &absolutePath) noexcept
Creates a file that simply contains this string, without doing the sanity-checking that the normal co...
bool startAsProcess(const String ¶meters=String()) const
Launches the file as a process.
String getNativeLinkedTarget() const
This returns the native path that the symbolic link points to.
bool hasFileExtension(StringRef extensionToTest) const
Checks whether the file has a given extension.
bool exists() const
Checks whether the file actually exists.
bool copyDirectoryTo(const File &newDirectory) const
Copies a directory.
bool loadFileAsData(MemoryBlock &result) const
Loads a file's contents into memory as a block of binary data.
bool setLastModificationTime(Time newTime) const
Changes the modification time for this file.
Time getLastAccessTime() const
Returns the last time this file was accessed.
Result createDirectory() const
Creates a new directory for this filename.
static File getCurrentWorkingDirectory()
Returns the current working directory.
static StringRef getSeparatorString()
The system-specific file separator character, as a string.
File & operator=(const String &newAbsolutePath)
Sets the file based on an absolute pathname.
static void JUCE_CALLTYPE writeToLog(const String &message)
Writes a string to the current logger.
A class to hold a resizable block of raw data.
MemoryMappedFile(const File &file, AccessMode mode, bool exclusive=false)
Opens a file and maps it to an area of virtual memory.
AccessMode
The read/write flags used when opening a memory mapped file.
@ readWrite
Indicates that the memory can be read and written to - changes that are made will be flushed back to ...
@ readOnly
Indicates that the memory can only be read.
static bool JUCE_CALLTYPE openDocument(const String &documentURL, const String ¶meters)
Tries to launch the OS's default reader application for a given file or URL.
static Random & getSystemRandom() noexcept
The overhead of creating a new Random object is fairly small, but if you want to avoid it,...
A general-purpose range object, that simply represents any linear range with a start and end point.
Represents the 'success' or 'failure' of an operation, and holds an associated error message to descr...
static Result fail(const String &errorMessage) noexcept
Creates a 'failure' result.
static Result ok() noexcept
Creates and returns a 'successful' result.
A special array for holding a list of strings.
A simple class for holding temporary references to a string literal or String.
String::CharPointerType text
The text that is referenced.
static String repeatedString(StringRef stringToRepeat, int numberOfTimesToRepeat)
Creates a string which is a version of a string repeated and joined together.
int indexOfChar(juce_wchar characterToLookFor) const noexcept
Searches for a character inside this string.
int length() const noexcept
Returns the number of characters in the string.
bool endsWithChar(juce_wchar character) const noexcept
Tests whether the string ends with a particular character.
bool isEmpty() const noexcept
Returns true if the string contains no characters.
int64 hashCode64() const noexcept
Generates a probably-unique 64-bit hashcode from this string.
bool containsChar(juce_wchar character) const noexcept
Tests whether the string contains a particular character.
bool endsWithIgnoreCase(StringRef text) const noexcept
Tests whether the string ends with another string.
String trimEnd() const
Returns a copy of this string with any whitespace characters removed from the end.
static String toHexString(IntegerType number)
Returns a string representing this numeric value in hexadecimal.
int lastIndexOfChar(juce_wchar character) const noexcept
Searches for a character inside this string (working backwards from the end of the string).
String trimCharactersAtEnd(StringRef charactersToTrim) const
Returns a copy of this string, having removed a specified set of characters from its end.
String replaceCharacter(juce_wchar characterToReplace, juce_wchar characterToInsertInstead) const
Returns a string with all occurrences of a character replaced with a different one.
String substring(int startIndex, int endIndex) const
Returns a subsection of the string.
int hashCode() const noexcept
Generates a probably-unique 32-bit hashcode from this string.
bool isNotEmpty() const noexcept
Returns true if the string contains at least one character.
Manages a temporary file, which will be deleted when this object is deleted.
@ useHiddenFile
Indicates that the temporary file should be hidden - i.e.
Holds an absolute date and time.
static Time JUCE_CALLTYPE getCurrentTime() noexcept
Returns a Time object that is set to the current system time.
This is a base class for classes that perform a unit test.