在 C# 中,我使用 FileShare.Delete 打开一个文件。这允许我打开文件而不限制其他进程删除它。例如:
using (FileStream fs = new FileStream(@"C:\temp\1.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete))
{
int len = (int)fs.Length;
byte[] array = new byte[len];
int bytesRead = fs.Read(array, 0, len);
}
我的问题是:
- 如果文件在我们创建流之后但在我们读取它之前被另一个进程删除,会发生什么情况?操作系统是否保留文件的副本,直到流\句柄关闭?
- 我可以依靠读取已删除的文件而不会出现任何错误或错误的内容吗?
最佳答案
文件被标记为删除,但在最后一个打开的句柄关闭之前实际上没有删除,如documentation for DeleteFile中所述。 .
请注意,您无法打开标记为删除的文件的新句柄,但该文件仍会出现在目录列表中,并且在实际删除之前不能被同名文件替换。这与 Unix 系统不同,在 Unix 系统中文件会立即从目录中消失(“未链接”)。正如 Ben 在评论中所建议的那样,您可以通过在删除文件之前重命名和/或移动文件来解决此问题。
此外,正如 MoonRabbit 指出的那样,您可以使用资源管理器“删除”打开的文件,但那是因为那样只会将文件移动到回收站。用于立即删除文件的 Shift+Delete 选项将不起作用。
关于c# - 当文件被不同的进程删除时,文件流会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39954313/