Skip to content

fix: move a read-only file #1239

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 1, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,12 @@ public interface IMockFileDataAccessor : IFileSystem
MockDriveData GetDrive(string name);

/// <summary>
/// Adds the file.
/// </summary>
void AddFile(string path, MockFileData mockFile);
/// <param name="path">The path of the file to add.</param>
/// <param name="mockFile">The file data to add.</param>
/// <param name="verifyAccess">Flag indicating if the access conditions should be verified.</param>
void AddFile(string path, MockFileData mockFile, bool verifyAccess = true);

/// <summary>
/// </summary>
Expand All @@ -58,10 +62,11 @@ public interface IMockFileDataAccessor : IFileSystem
/// Removes the file.
/// </summary>
/// <param name="path">The file to remove.</param>
/// <param name="verifyAccess">Flag indicating if the access conditions should be verified.</param>
/// <remarks>
/// The file must not exist.
/// </remarks>
void RemoveFile(string path);
void RemoveFile(string path, bool verifyAccess = true);

/// <summary>
/// Determines whether the file exists.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -546,8 +546,8 @@ public override void Move(string sourceFileName, string destFileName)
}
VerifyDirectoryExists(destFileName);

mockFileDataAccessor.RemoveFile(sourceFileName);
mockFileDataAccessor.AddFile(destFileName, mockFileDataAccessor.AdjustTimes(new MockFileData(sourceFile), TimeAdjustments.LastAccessTime));
mockFileDataAccessor.RemoveFile(sourceFileName, false);
mockFileDataAccessor.AddFile(destFileName, mockFileDataAccessor.AdjustTimes(new MockFileData(sourceFile), TimeAdjustments.LastAccessTime), false);
}

#if FEATURE_FILE_MOVE_WITH_OVERWRITE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ private void SetEntry(string path, MockFileData mockFile)
}

/// <inheritdoc />
public void AddFile(string path, MockFileData mockFile)
public void AddFile(string path, MockFileData mockFile, bool verifyAccess = true)
{
var fixedPath = FixPath(path, true);

Expand All @@ -237,7 +237,7 @@ public void AddFile(string path, MockFileData mockFile)
var isReadOnly = (file.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly;
var isHidden = (file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden;

if (isReadOnly || isHidden)
if (verifyAccess && (isReadOnly || isHidden))
{
throw CommonExceptions.AccessDenied(path);
}
Expand Down Expand Up @@ -294,9 +294,10 @@ public void AddDirectory(IDirectoryInfo path)
/// </summary>
/// <param name="path">An <see cref="IFileInfo"/> representing the path of the new file to add.</param>
/// <param name="data">The data to use for the contents of the new file.</param>
public void AddFile(IFileInfo path, MockFileData data)
/// <param name="verifyAccess">Flag indicating if the access conditions should be verified.</param>
public void AddFile(IFileInfo path, MockFileData data, bool verifyAccess = true)
{
AddFile(path.FullName, data);
AddFile(path.FullName, data, verifyAccess);
path.Refresh();
}

Expand Down Expand Up @@ -444,13 +445,13 @@ bool PathStartsWith(string path, string[] minMatch)
}

/// <inheritdoc />
public void RemoveFile(string path)
public void RemoveFile(string path, bool verifyAccess = true)
{
path = FixPath(path);

lock (files)
{
if (FileExists(path) && (FileIsReadOnly(path) || Directory.Exists(path) && AnyFileIsReadOnly(path)))
if (FileExists(path) && verifyAccess && (FileIsReadOnly(path) || Directory.Exists(path) && AnyFileIsReadOnly(path)))
{
throw CommonExceptions.AccessDenied(path);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ namespace System.IO.Abstractions.TestingHelpers
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
void AddDirectory(string path);
void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true);
void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments);
bool FileExists(string path);
System.IO.Abstractions.TestingHelpers.MockDriveData GetDrive(string name);
System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path);
void MoveDirectory(string sourcePath, string destPath);
void RemoveFile(string path);
void RemoveFile(string path, bool verifyAccess = true);
}
[System.Serializable]
public class MockDirectory : System.IO.Abstractions.DirectoryBase
Expand Down Expand Up @@ -360,8 +360,8 @@ namespace System.IO.Abstractions.TestingHelpers
public void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive) { }
public void AddEmptyFile(System.IO.Abstractions.IFileInfo path) { }
public void AddEmptyFile(string path) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data, bool verifyAccess = true) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true) { }
public void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments) { }
Expand All @@ -371,7 +371,7 @@ namespace System.IO.Abstractions.TestingHelpers
public System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path) { }
public System.IO.Abstractions.TestingHelpers.MockFileSystem MockTime(System.Func<System.DateTime> dateTimeProvider) { }
public void MoveDirectory(string sourcePath, string destPath) { }
public void RemoveFile(string path) { }
public void RemoveFile(string path, bool verifyAccess = true) { }
}
public class MockFileSystemOptions
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ namespace System.IO.Abstractions.TestingHelpers
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
void AddDirectory(string path);
void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true);
void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments);
bool FileExists(string path);
System.IO.Abstractions.TestingHelpers.MockDriveData GetDrive(string name);
System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path);
void MoveDirectory(string sourcePath, string destPath);
void RemoveFile(string path);
void RemoveFile(string path, bool verifyAccess = true);
}
[System.Serializable]
public class MockDirectory : System.IO.Abstractions.DirectoryBase
Expand Down Expand Up @@ -415,8 +415,8 @@ namespace System.IO.Abstractions.TestingHelpers
public void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive) { }
public void AddEmptyFile(System.IO.Abstractions.IFileInfo path) { }
public void AddEmptyFile(string path) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data, bool verifyAccess = true) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true) { }
public void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments) { }
Expand All @@ -426,7 +426,7 @@ namespace System.IO.Abstractions.TestingHelpers
public System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path) { }
public System.IO.Abstractions.TestingHelpers.MockFileSystem MockTime(System.Func<System.DateTime> dateTimeProvider) { }
public void MoveDirectory(string sourcePath, string destPath) { }
public void RemoveFile(string path) { }
public void RemoveFile(string path, bool verifyAccess = true) { }
}
public class MockFileSystemOptions
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ namespace System.IO.Abstractions.TestingHelpers
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
void AddDirectory(string path);
void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true);
void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments);
bool FileExists(string path);
System.IO.Abstractions.TestingHelpers.MockDriveData GetDrive(string name);
System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path);
void MoveDirectory(string sourcePath, string destPath);
void RemoveFile(string path);
void RemoveFile(string path, bool verifyAccess = true);
}
[System.Serializable]
public class MockDirectory : System.IO.Abstractions.DirectoryBase
Expand Down Expand Up @@ -439,8 +439,8 @@ namespace System.IO.Abstractions.TestingHelpers
public void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive) { }
public void AddEmptyFile(System.IO.Abstractions.IFileInfo path) { }
public void AddEmptyFile(string path) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data, bool verifyAccess = true) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true) { }
public void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments) { }
Expand All @@ -450,7 +450,7 @@ namespace System.IO.Abstractions.TestingHelpers
public System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path) { }
public System.IO.Abstractions.TestingHelpers.MockFileSystem MockTime(System.Func<System.DateTime> dateTimeProvider) { }
public void MoveDirectory(string sourcePath, string destPath) { }
public void RemoveFile(string path) { }
public void RemoveFile(string path, bool verifyAccess = true) { }
}
public class MockFileSystemOptions
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ namespace System.IO.Abstractions.TestingHelpers
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
void AddDirectory(string path);
void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true);
void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments);
bool FileExists(string path);
System.IO.Abstractions.TestingHelpers.MockDriveData GetDrive(string name);
System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path);
void MoveDirectory(string sourcePath, string destPath);
void RemoveFile(string path);
void RemoveFile(string path, bool verifyAccess = true);
}
[System.Serializable]
public class MockDirectory : System.IO.Abstractions.DirectoryBase
Expand Down Expand Up @@ -453,8 +453,8 @@ namespace System.IO.Abstractions.TestingHelpers
public void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive) { }
public void AddEmptyFile(System.IO.Abstractions.IFileInfo path) { }
public void AddEmptyFile(string path) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data, bool verifyAccess = true) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true) { }
public void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments) { }
Expand All @@ -464,7 +464,7 @@ namespace System.IO.Abstractions.TestingHelpers
public System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path) { }
public System.IO.Abstractions.TestingHelpers.MockFileSystem MockTime(System.Func<System.DateTime> dateTimeProvider) { }
public void MoveDirectory(string sourcePath, string destPath) { }
public void RemoveFile(string path) { }
public void RemoveFile(string path, bool verifyAccess = true) { }
}
public class MockFileSystemOptions
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ namespace System.IO.Abstractions.TestingHelpers
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
void AddDirectory(string path);
void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile);
void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true);
void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath);
System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments);
bool FileExists(string path);
System.IO.Abstractions.TestingHelpers.MockDriveData GetDrive(string name);
System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path);
void MoveDirectory(string sourcePath, string destPath);
void RemoveFile(string path);
void RemoveFile(string path, bool verifyAccess = true);
}
[System.Serializable]
public class MockDirectory : System.IO.Abstractions.DirectoryBase
Expand Down Expand Up @@ -360,8 +360,8 @@ namespace System.IO.Abstractions.TestingHelpers
public void AddDrive(string name, System.IO.Abstractions.TestingHelpers.MockDriveData mockDrive) { }
public void AddEmptyFile(System.IO.Abstractions.IFileInfo path) { }
public void AddEmptyFile(string path) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile) { }
public void AddFile(System.IO.Abstractions.IFileInfo path, System.IO.Abstractions.TestingHelpers.MockFileData data, bool verifyAccess = true) { }
public void AddFile(string path, System.IO.Abstractions.TestingHelpers.MockFileData mockFile, bool verifyAccess = true) { }
public void AddFileFromEmbeddedResource(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public void AddFilesFromEmbeddedNamespace(string path, System.Reflection.Assembly resourceAssembly, string embeddedResourcePath) { }
public System.IO.Abstractions.TestingHelpers.MockFileData AdjustTimes(System.IO.Abstractions.TestingHelpers.MockFileData fileData, System.IO.Abstractions.TestingHelpers.TimeAdjustments timeAdjustments) { }
Expand All @@ -371,7 +371,7 @@ namespace System.IO.Abstractions.TestingHelpers
public System.IO.Abstractions.TestingHelpers.MockFileData GetFile(string path) { }
public System.IO.Abstractions.TestingHelpers.MockFileSystem MockTime(System.Func<System.DateTime> dateTimeProvider) { }
public void MoveDirectory(string sourcePath, string destPath) { }
public void RemoveFile(string path) { }
public void RemoveFile(string path, bool verifyAccess = true) { }
}
public class MockFileSystemOptions
{
Expand Down
Loading
Loading