c# - 当文件被不同的进程删除时,文件流会发生什么?

标签 c# .net windows filestream

在 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);
}

我的问题是:

  1. 如果文件在我们创建流之后但在我们读取它之前被另一个进程删除,会发生什么情况?操作系统是否保留文件的副本,直到流\句柄关闭?
  2. 我可以依靠读取已删除的文件而不会出现任何错误或错误的内容吗?

最佳答案

文件被标记为删除,但在最后一个打开的句柄关闭之前实际上没有删除,如documentation for DeleteFile中所述。 .

请注意,您无法打开标记为删除的文件的新句柄,但该文件仍会出现在目录列表中,并且在实际删除之前不能被同名文件替换。这与 Unix 系统不同,在 Unix 系统中文件会立即从目录中消失(“未链接”)。正如 Ben 在评论中所建议的那样,您可以通过在删除文件之前重命名和/或移动文件来解决此问题。

此外,正如 MoonRabbit 指出的那样,您可以使用资源管理器“删除”打开的文件,但那是因为那样只会将文件移动到回收站。用于立即删除文件的 Shift+Delete 选项将不起作用。

关于c# - 当文件被不同的进程删除时,文件流会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39954313/

相关文章:

c# - 什么是 Microsoft.Bcl.Async?

windows - git被阻塞,如何安装npm模块

python - Conemu - 重用实例,但不将其带到前台

c# - C# 中的 JPEG 工件去除

c# - 为什么 DI 会为两个不同的范围返回相同的 DbContext?

c# - 以编程方式从 PC 识别连接的设备是否为 Android

.net - CType 和类型转换异常

c# - 尝试 "Reverse Engineer Code First"MySQL 数据库时出错

c# - 在不复制源列表的情况下高效地对 IList<T> 进行排序

windows - 在 GNU 的 bash 中更改目录