public static void Move(string sourcePath, string targetPath)
 {
     if (!NativeMethods.MoveFile(sourcePath, targetPath))
     {
         throw LongPathCommon.GetExceptionFromLastWin32Error();
     }
 }
Esempio n. 2
0
        /// <summary>
        ///     Deletes the specified file.
        /// </summary>
        /// <param name = "path">
        ///     A <see cref = "string" /> containing the path of the file to delete.
        /// </param>
        /// <exception cref = "ArgumentNullException">
        ///     <paramref name = "path" /> is <see langword = "null" />.
        /// </exception>
        /// <exception cref = "ArgumentException">
        ///     <paramref name = "path" /> is an empty string (""), contains only white
        ///     space, or contains one or more invalid characters as defined in
        ///     <see cref = "System.IO.Path.GetInvalidPathChars()" />.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> contains one or more components that exceed
        ///     the drive-defined maximum length. For example, on Windows-based
        ///     platforms, components must not exceed 255 characters.
        /// </exception>
        /// <exception cref = "PathTooLongException">
        ///     <paramref name = "path" /> exceeds the system-defined maximum length.
        ///     For example, on Windows-based platforms, paths must not exceed
        ///     32,000 characters.
        /// </exception>
        /// <exception cref = "FileNotFoundException">
        ///     <paramref name = "path" /> could not be found.
        /// </exception>
        /// <exception cref = "DirectoryNotFoundException">
        ///     One or more directories in <paramref name = "path" /> could not be found.
        /// </exception>
        /// <exception cref = "UnauthorizedAccessException">
        ///     The caller does not have the required access permissions.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> refers to a file that is read-only.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> is a directory.
        /// </exception>
        /// <exception cref = "IOException">
        ///     <paramref name = "path" /> refers to a file that is in use.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> specifies a device that is not ready.
        /// </exception>
        public static void Delete(string path)
        {
            var normalizedPath = LongPathCommon.NormalizeLongPath(path);

            if (!NativeMethods.DeleteFile(normalizedPath))
            {
                throw LongPathCommon.GetExceptionFromLastWin32Error();
            }
        }
Esempio n. 3
0
        /// <summary>
        ///     Copies the specified file to a specified new file, indicating whether to overwrite an existing file.
        /// </summary>
        /// <param name = "sourcePath">
        ///     A <see cref = "String" /> containing the path of the file to copy.
        /// </param>
        /// <param name = "destinationPath">
        ///     A <see cref = "String" /> containing the new path of the file.
        /// </param>
        /// <param name = "overwrite">
        ///     <see langword = "true" /> if <paramref name = "destinationPath" /> should be overwritten
        ///     if it refers to an existing file, otherwise, <see langword = "false" />.
        /// </param>
        /// <exception cref = "ArgumentNullException">
        ///     <paramref name = "sourcePath" /> and/or <paramref name = "destinationPath" /> is
        ///     <see langword = "null" />.
        /// </exception>
        /// <exception cref = "ArgumentException">
        ///     <paramref name = "sourcePath" /> and/or <paramref name = "destinationPath" /> is
        ///     an empty string (""), contains only white space, or contains one or more
        ///     invalid characters as defined in <see cref = "System.IO.Path.GetInvalidPathChars()" />.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "sourcePath" /> and/or <paramref name = "destinationPath" />
        ///     contains one or more components that exceed the drive-defined maximum length.
        ///     For example, on Windows-based platforms, components must not exceed 255 characters.
        /// </exception>
        /// <exception cref = "PathTooLongException">
        ///     <paramref name = "sourcePath" /> and/or <paramref name = "destinationPath" />
        ///     exceeds the system-defined maximum length. For example, on Windows-based platforms,
        ///     paths must not exceed 32,000 characters.
        /// </exception>
        /// <exception cref = "FileNotFoundException">
        ///     <paramref name = "sourcePath" /> could not be found.
        /// </exception>
        /// <exception cref = "DirectoryNotFoundException">
        ///     One or more directories in <paramref name = "sourcePath" /> and/or
        ///     <paramref name = "destinationPath" /> could not be found.
        /// </exception>
        /// <exception cref = "UnauthorizedAccessException">
        ///     The caller does not have the required access permissions.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "overwrite" /> is true and <paramref name = "destinationPath" /> refers to a
        ///     file that is read-only.
        /// </exception>
        /// <exception cref = "IOException">
        ///     <paramref name = "overwrite" /> is false and <paramref name = "destinationPath" /> refers to
        ///     a file that already exists.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "sourcePath" /> and/or <paramref name = "destinationPath" /> is a
        ///     directory.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "overwrite" /> is true and <paramref name = "destinationPath" /> refers to
        ///     a file that already exists and is in use.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "sourcePath" /> refers to a file that is in use.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "sourcePath" /> and/or <paramref name = "destinationPath" /> specifies
        ///     a device that is not ready.
        /// </exception>
        public static void Copy(string sourcePath, string destinationPath, bool overwrite)
        {
            var normalizedSourcePath      = LongPathCommon.NormalizeLongPath(sourcePath, "sourcePath");
            var normalizedDestinationPath = LongPathCommon.NormalizeLongPath(destinationPath, "destinationPath");

            if (!NativeMethods.CopyFile(normalizedSourcePath, normalizedDestinationPath, !overwrite))
            {
                throw LongPathCommon.GetExceptionFromLastWin32Error();
            }
        }
Esempio n. 4
0
        /// <summary>
        ///     Returns a value indicating whether the specified path refers to an existing file.
        /// </summary>
        /// <param name = "path">
        ///     A <see cref = "string" /> containing the path to check.
        /// </param>
        /// <returns>
        ///     <see langword = "true" /> if <paramref name = "path" /> refers to an existing file;
        ///     otherwise, <see langword = "false" />.
        /// </returns>
        /// <remarks>
        ///     Note that this method will return false if any error occurs while trying to determine
        ///     if the specified file exists. This includes situations that would normally result in
        ///     thrown exceptions including (but not limited to); passing in a file name with invalid
        ///     or too many characters, an I/O error such as a failing or missing disk, or if the caller
        ///     does not have Windows or Code Access Security (CAS) permissions to to read the file.
        /// </remarks>
        public static bool Exists(string path)
        {
            bool isDirectory;

            if (LongPathCommon.Exists(path, out isDirectory))
            {
                return(!isDirectory);
            }

            return(false);
        }
Esempio n. 5
0
        private static SafeFileHandle GetFileHandle(string normalizedPath, FileMode mode, FileAccess access, FileShare share,
                                                    FileOptions options)
        {
            var handle = NativeMethods.CreateFile(normalizedPath, access.ToNative(), share.ToNative(), IntPtr.Zero,
                                                  mode.ToNative(),
                                                  options.ToNative(), IntPtr.Zero);

            if (handle.IsInvalid)
            {
                throw LongPathCommon.GetExceptionFromLastWin32Error();
            }

            return(handle);
        }
        /// <summary>
        ///     Creates the specified directory.
        /// </summary>
        /// <param name = "path">
        ///     A <see cref = "string" /> containing the path of the directory to create.
        /// </param>
        /// <exception cref = "ArgumentNullException">
        ///     <paramref name = "path" /> is <see langword = "null" />.
        /// </exception>
        /// <exception cref = "ArgumentException">
        ///     <paramref name = "path" /> is an empty string (""), contains only white
        ///     space, or contains one or more invalid characters as defined in
        ///     <see cref = "System.IO.Path.GetInvalidPathChars()" />.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> contains one or more components that exceed
        ///     the drive-defined maximum length. For example, on Windows-based
        ///     platforms, components must not exceed 255 characters.
        /// </exception>
        /// <exception cref = "PathTooLongException">
        ///     <paramref name = "path" /> exceeds the system-defined maximum length.
        ///     For example, on Windows-based platforms, paths must not exceed
        ///     32,000 characters.
        /// </exception>
        /// <exception cref = "DirectoryNotFoundException">
        ///     <paramref name = "path" /> contains one or more directories that could not be
        ///     found.
        /// </exception>
        /// <exception cref = "UnauthorizedAccessException">
        ///     The caller does not have the required access permissions.
        /// </exception>
        /// <exception cref = "IOException">
        ///     <paramref name = "path" /> is a file.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> specifies a device that is not ready.
        /// </exception>
        /// <remarks>
        ///     Note: Unlike <see cref = "System.IO.Directory.CreateDirectory(System.String)" />, this method only creates
        ///     the last directory in <paramref name = "path" />.
        /// </remarks>
        public static void Create(string path)
        {
            var normalizedPath = LongPathCommon.NormalizeLongPath(path);

            if (!NativeMethods.CreateDirectory(normalizedPath, IntPtr.Zero))
            {
                // To mimic Directory.CreateDirectory, we don't throw if the directory (not a file) already exists
                var errorCode = Marshal.GetLastWin32Error();
                if (errorCode != NativeMethods.ERROR_ALREADY_EXISTS || !Exists(path))
                {
                    throw LongPathCommon.GetExceptionFromWin32Error(errorCode);
                }
            }
        }
        private static IEnumerable <string> EnumerateFileSystemEntries(string path, string searchPattern,
                                                                       bool includeDirectories, bool includeFiles)
        {
            var normalizedSearchPattern = LongPathCommon.NormalizeSearchPattern(searchPattern);
            var normalizedPath          = LongPathCommon.NormalizeLongPath(path);

            // First check whether the specified path refers to a directory and exists
            FileAttributes attributes;
            var            errorCode = LongPathCommon.TryGetDirectoryAttributes(normalizedPath, out attributes);

            if (errorCode != 0)
            {
                throw LongPathCommon.GetExceptionFromWin32Error(errorCode);
            }

            return(EnumerateFileSystemIterator(normalizedPath, normalizedSearchPattern, includeDirectories, includeFiles));
        }
        private static SafeFindHandle BeginFind(string normalizedPathWithSearchPattern,
                                                out WIN32_FIND_DATA findData)
        {
            var handle = NativeMethods.FindFirstFile(normalizedPathWithSearchPattern, out findData);

            if (handle.IsInvalid)
            {
                var errorCode = Marshal.GetLastWin32Error();
                if (errorCode != NativeMethods.ERROR_FILE_NOT_FOUND)
                {
                    throw LongPathCommon.GetExceptionFromWin32Error(errorCode);
                }

                return(null);
            }

            return(handle);
        }
        private static IEnumerable <string> EnumerateFileSystemIterator(string normalizedPath, string normalizedSearchPattern,
                                                                        bool includeDirectories, bool includeFiles)
        {
            // NOTE: Any exceptions thrown from this method are thrown on a call to IEnumerator<string>.MoveNext()

            var path = LongPathCommon.RemoveLongPathPrefix(normalizedPath);

            WIN32_FIND_DATA findData;

            using (var handle = BeginFind(System.IO.Path.Combine(normalizedPath, normalizedSearchPattern), out findData))
            {
                if (handle == null)
                {
                    yield break;
                }

                do
                {
                    var currentFileName = findData.cFileName;

                    if (IsDirectory(findData.dwFileAttributes))
                    {
                        if (includeDirectories && !IsCurrentOrParentDirectory(currentFileName))
                        {
                            yield return(System.IO.Path.Combine(path, currentFileName));
                        }
                    }
                    else
                    {
                        if (includeFiles)
                        {
                            yield return(System.IO.Path.Combine(path, currentFileName));
                        }
                    }
                } while (NativeMethods.FindNextFile(handle, out findData));

                var errorCode = Marshal.GetLastWin32Error();
                if (errorCode != NativeMethods.ERROR_NO_MORE_FILES)
                {
                    throw LongPathCommon.GetExceptionFromWin32Error(errorCode);
                }
            }
        }
Esempio n. 10
0
        /// <summary>
        ///     Opens the specified file.
        /// </summary>
        /// <param name = "path">
        ///     A <see cref = "String" /> containing the path of the file to open.
        /// </param>
        /// <param name = "access">
        ///     One of the <see cref = "FileAccess" /> value that specifies the operations that can be
        ///     performed on the file.
        /// </param>
        /// <param name = "mode">
        ///     One of the <see cref = "FileMode" /> values that specifies whether a file is created
        ///     if one does not exist, and determines whether the contents of existing files are
        ///     retained or overwritten.
        /// </param>
        /// <param name = "share">
        ///     One of the <see cref = "FileShare" /> values specifying the type of access other threads
        ///     have to the file.
        /// </param>
        /// <param name = "bufferSize">
        ///     An <see cref = "Int32" /> containing the number of bytes to buffer for reads and writes
        ///     to the file, or 0 to specifiy the default buffer size, 1024.
        /// </param>
        /// <param name = "options">
        ///     One or more of the <see cref = "FileOptions" /> values that describes how to create or
        ///     overwrite the file.
        /// </param>
        /// <returns>
        ///     A <see cref = "FileStream" /> that provides access to the file specified in
        ///     <paramref name = "path" />.
        /// </returns>
        /// <exception cref = "ArgumentNullException">
        ///     <paramref name = "path" /> is <see langword = "null" />.
        /// </exception>
        /// <exception cref = "ArgumentException">
        ///     <paramref name = "path" /> is an empty string (""), contains only white
        ///     space, or contains one or more invalid characters as defined in
        ///     <see cref = "System.IO.Path.GetInvalidPathChars()" />.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> contains one or more components that exceed
        ///     the drive-defined maximum length. For example, on Windows-based
        ///     platforms, components must not exceed 255 characters.
        /// </exception>
        /// <exception cref = "ArgumentOutOfRangeException">
        ///     <paramref name = "bufferSize" /> is less than 0.
        /// </exception>
        /// <exception cref = "PathTooLongException">
        ///     <paramref name = "path" /> exceeds the system-defined maximum length.
        ///     For example, on Windows-based platforms, paths must not exceed
        ///     32,000 characters.
        /// </exception>
        /// <exception cref = "DirectoryNotFoundException">
        ///     One or more directories in <paramref name = "path" /> could not be found.
        /// </exception>
        /// <exception cref = "UnauthorizedAccessException">
        ///     The caller does not have the required access permissions.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> refers to a file that is read-only and <paramref name = "access" />
        ///     is not <see cref = "FileAccess.Read" />.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> is a directory.
        /// </exception>
        /// <exception cref = "IOException">
        ///     <paramref name = "path" /> refers to a file that is in use.
        ///     <para>
        ///         -or-
        ///     </para>
        ///     <paramref name = "path" /> specifies a device that is not ready.
        /// </exception>
        public static FileStream Open(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize,
                                      FileOptions options)
        {
            const int DefaultBufferSize = 1024;

            if (bufferSize == 0)
            {
                bufferSize = DefaultBufferSize;
            }

            var normalizedPath = LongPathCommon.NormalizeLongPath(path);

            var handle = GetFileHandle(normalizedPath, mode, access, share, options);

            var fileStream = new FileStream(handle, access, bufferSize,
                                            (options & FileOptions.Asynchronous) == FileOptions.Asynchronous);

            if (mode == FileMode.Append)
            {
                fileStream.Seek(0L, SeekOrigin.End);
            }

            return(fileStream);
        }