【问题标题】:C# Prevent other processes from locking your files/foldersC# 防止其他进程锁定您的文件/文件夹
【发布时间】:2011-05-26 14:19:49
【问题描述】:

我暂时将一个 .zip 文件解压缩到磁盘,我想稍后删除所有这些文件。在测试过程中,我提取了一些 TortoiseSVN 元数据文件夹。当我的应用程序稍后尝试删除它们时,它以UnauthorizedAccessException 失败。
我认为这是由于 TSVNCache 监视文件系统并在我想删除它时锁定了该文件夹。

我怎样才能防止这样的事情发生?

编辑:这里有一些代码可以更好地说明问题:

  public class Package : IDisposable {

    private bool _disposed;

    public string Filename { get; set; }

    public DirectoryInfo RootFolder { get; set; }

    public Package( string filename, DirectoryInfo rootFolder ) {
      Filename   = filename;
      RootFolder = rootFolder;
    }

    public static Package Expand( string packageFileName, DirectoryInfo targetDirectory ) {
      FileInfo packageFile = new FileInfo( packageFileName );

      string publicKey      = Settings.Default.PublicKey;
      byte[] publicKeyBytes = Convert.FromBase64String( publicKey );

      byte[] packageBytes          = File.ReadAllBytes( packageFile.FullName );
      byte[] decryptedPackageBytes = Blob.DecryptBlob( packageBytes, publicKeyBytes, false );

      // Write result
      string outputFolderName = targetDirectory.FullName;
      Directory.CreateDirectory( outputFolderName );

      ZipFile zipFile = ZipFile.Read( decryptedPackageBytes );
      zipFile.ExtractAll( outputFolderName );

      Package result = new Package( packageFile.FullName, new DirectoryInfo( outputFolderName ) );
      return result;
    }

    ~Package() {
      Dispose( false );
    }

    public void Dispose() {
      Dispose( true );
      GC.SuppressFinalize( this );
    }

    private void Dispose( bool disposing ) {
      if( _disposed ) {
        return;
      }
      if( disposing ) {
        RootFolder.Delete( true );
      }
      // Dispose unmanaged resources.
      _disposed = true;
    }
  }

我会在 using 块中使用 Package.Expand 并在那里访问提取的文件(目前我只是循环它们并将它们的名称打印到控制台)。当块退出并调用 Dispose 时,我收到有关 all-wcprops 的异常。不过,其他与 svn 无关的文件会被删除。

【问题讨论】:

    标签: c# .net locking


    【解决方案1】:

    您确定您正确地处理了您的句柄,并且运行该应用程序的用户有权删除它?

    【讨论】:

    • 创建文件的用户与试图删除文件的用户相同。这一切都是同一个应用程序。它也适用于其他文件。我刚刚注意到 SVN 文件的这种行为。
    【解决方案2】:

    我对 Tortiose-Git 有同样的问题。

    当我遇到锁定问题时,我会使用 taskmanager 来终止 TGitCache-Process(或者在您的情况下是 TSVNCache-process)

    短暂的停顿后,TGitCache 再次启动,我可以继续使用乌龟。

    你也可以想到excluding certain directories from tortois-svn supervision

    【讨论】:

    • 嗯,这对我的开发机器来说并没有真正的问题。我只是担心客户端机器上的这种行为。我真的希望能够删除这些文件(而不是让其他应用程序接触它们)。
    • 客户端机器不会安装tortoise:-)你可以通过在创建文件后自己锁定文件或不允许其他进程通过acls读取文件来防止被其他人锁定
    • 我的问题并不是专门针对 SVN 文件。这只是一个例子(我如何注意到它可能是一个普遍问题)。我会看看我能挖掘出关于 ACL 的内容;)
    【解决方案3】:

    尽管我仍然对我的问题的答案感兴趣,但我的问题与文件锁定无关。 UnauthorizedAccessException 在这种情况下只是表示一个只读文件。

    这里讨论了如何解决这个问题:How do I delete a directory with read-only files in C#?

    【讨论】:

      【解决方案4】:

      您可以使用 CreateFile WIN32 API(通过 p/invoke)打开将 ShareMode 设置为 0 的目录句柄,然后其他进程将无法获得该目录的句柄。

      【讨论】:

      • 没有托管等效项吗? FileShare.None 似乎甚至阻止我自己的进程打开目录/文件(根据文档)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多