我暂时将.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相关文件也会被删除。
答案 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的目录句柄,然后其他任何进程都无法获取该目录的句柄。