【问题标题】:A process cannot access a File because it is being used by another process一个进程无法访问一个文件,因为它正被另一个进程使用
【发布时间】:2019-04-12 11:21:18
【问题描述】:

我意识到这个问题有多种变体,但在查看它们时,我没有看到我的确切用例,而且我的结果有问题。

我正在做的是将一些 BZ2 压缩文件通过 FTP 传输到我的硬盘驱动器的文件夹中。然后我解压缩每一个以供审查。最后,我想将文件通过电子邮件发送给某人,但我想先将它们放入 Zip 存档中以使其更容易。下面是代码。

private void buttonCreateZip_Click(object sender, EventArgs e)
{
    Directory.CreateDirectory(@"C:\temp\logfiles\" + comboBoxDirectory.SelectedItem.ToString() + "\\zip\\");

    string startPath = @"C:\temp\logfiles\" + comboBoxDirectory.SelectedItem.ToString();

    string zipPath = @"C:\temp\logfiles\" + comboBoxDirectory.SelectedItem.ToString() + "\\zip\\" + comboBoxDirectory.SelectedItem.ToString() + ".zip";

    File.SetAttributes(@"C:\temp\logfiles\" + comboBoxDirectory.SelectedItem.ToString() + "\\zip\\", FileAttributes.Normal);
    File.SetAttributes(@"C:\temp\logfiles\" + comboBoxDirectory.SelectedItem.ToString() + "\\", FileAttributes.Normal);

    ZipFile.CreateFromDirectory(startPath, zipPath);
}

我不是单独组合文件,而是使用一个 API 来获取目标目录中的所有文件并将它们压缩到存档中。

问题在于,即使我得到了例外

进程无法访问文件“C:...”,因为它正被另一个进程使用”

它无论如何都会在我为此目的创建的 zip 子目录中创建 ZIP 存档。它几乎看起来像是在库函数CreateFromDirectory 中,但这是我通过引用访问的标准库的一部分:

System.IO.Compression.FileSystem。

【问题讨论】:

    标签: c# .net winforms io zipfile


    【解决方案1】:

    如果您不处理 FileHandle(或任何封装所说的句柄),这种情况最常发生*。文件句柄和网络连接是需要Disposing 的非托管资源的 主要示例。您应该始终丢弃它们。

    我一直认为将任何一次性资源的创建和处置分开是个坏主意。您应该始终在同一段代码中执行 Create、Use 和 Dispose(就像在那个 Button click 中一样)。理想情况下使用 using 块。高级程序员可以忽略这一点,但根据您的问题,我认为您更偏向于初学者。

    *除了在另一个程序中直接打开文件之外,当然!

    【讨论】:

      【解决方案2】:

      压缩文件的目标目录:
      @"C:\temp\logfiles\[Some Name]\Zip"

      包含在源目录的路径中,压缩操作的基础目录:
      @"C:\temp\logfiles\[Some Name]

      ZipFile.CreateFromDirectory 包括基本目录的子目录树结构及其在创建压缩文件时的内容,因此它也会尝试压缩它正在创建的目标文件。当然它不能访问它,因为它(你猜怎么着)正在使用中。

      如果您将目标目录移到基本路径之外,它不会引发任何异常。

      您可以将用户Temp 目录用作压缩文件的临时目标,然后在完成后将其移动到目标目录。

      用户临时目录由Environment.GetEnvironmentVariable()返回:

      Environment.GetEnvironmentVariable("Temp", EnvironmentVariableTarget.User);
      

      您还需要删除 Temp zip 文件,并在任何情况下确认它不存在(具有该名称的文件可能因任何原因而存在,并且尝试覆盖它会导致错误)。

      使用用户临时目录创建 ZipFile 的可能方法示例:

      string SourceFolder = @"C:\temp\logfiles\";
      string DestinationFolder = @"C:\temp\logfiles\Zip";
      string ZippedFileName = "ZippedFile.zip";
      
      string UserTempFolder = Environment.GetEnvironmentVariable("Temp", EnvironmentVariableTarget.User);
      string ZippedTempFile = Path.Combine(UserTempFolder, ZippedFileName);
      if (File.Exists(ZippedTempFile)) { File.Delete(ZippedTempFile); }
      
      ZipFile.CreateFromDirectory(SourceFolder, ZippedTempFile);
      
      Directory.CreateDirectory(DestinationFolder);
      
      File.Move(ZippedTempFile, Path.Combine(DestinationFolder, ZippedFileName));
      

      【讨论】:

      • 谢谢,这有助于我使用 powershell 提取 zip 文件。
      猜你喜欢
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2011-07-05
      • 2015-12-07
      • 2011-04-17
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多