C#阻止其他进程锁定您的文件/文件夹

时间:2011-05-26 14:19:50

标签: c# .net locking

我暂时将.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;
    }
  }

我会在一个使用块中使用Package.Expand并访问那里提取的文件(目前我只是遍历它们并将它们的名字打印到控制台)。当块退出并调用Dispose时,我得到关于all-wcprops的例外。但是,其他非svn相关文件也会被删除。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我和tortiose-Git有同样的问题。

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

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

您还可以考虑excluding certain directories from tortois-svn supervision

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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