CopyDir recursively copies a directory tree, attempting to preserve permissions. Source directory must exist, destination directory must *not* exist.
EnsureDir tries to ensure that a directory is present at the given path. It first checks if the directory already exists at the given path. If there isn't one, it tries to create it with the given permissions. However, it does not try to create the directory recursively.
EquivalentPaths compares the paths passed to check if they are equivalent. It respects the case-sensitivity of the underlying filesysyems.
HasFilepathPrefix will determine if "path" starts with "prefix" from the point of view of a filesystem.
Unlike filepath.HasPrefix, this function is path-aware, meaning that it knows that two directories /foo and /foobar are not the same thing, and therefore HasFilepathPrefix("/foobar", "/foo") will return false.
This function also handles the case where the involved filesystems are case-insensitive, meaning /foo/bar and /Foo/Bar correspond to the same file. In that situation HasFilepathPrefix("/Foo/Bar", "/foo") will return true. The implementation is *not* OS-specific, so a FAT32 filesystem mounted on Linux will be handled correctly.
IsCaseSensitiveFilesystem determines if the filesystem where dir exists is case sensitive or not.
CAVEAT: this function works by taking the last component of the given path and flipping the case of the first letter for which case flipping is a reversible operation (/foo/Bar → /foo/bar), then testing for the existence of the new filename. There are two possibilities:
1. The alternate filename does not exist. We can conclude that the filesystem is case sensitive.
2. The filename happens to exist. We have to test if the two files are the same file (case insensitive file system) or different ones (case sensitive filesystem).
If the input directory is such that the last component is composed exclusively of case-less codepoints (e.g. numbers), this function will return false.
IsDir determines is the path given is a directory or not.
IsNonEmptyDir determines if the path given is a non-empty directory or not.
IsRegular determines if the path given is a regular file or not.
IsSymlink determines if the given path is a symbolic link.
ReadActualFilenames is used to determine the actual file names in given directory.
On case sensitive file systems like ext4, it will check if those files exist using `os.Stat` and return a map with key and value as filenames which exist in the folder.
Otherwise, it reads the contents of the directory and returns a map which has the given file name as the key and actual filename as the value(if it was found).
RenameWithFallback attempts to rename a file or directory, but falls back to copying in the event of a cross-device link error. If the fallback copy succeeds, src is still removed, emulating normal rename behavior.