C# 如何检查文件夹或文件是否已锁定、打开或正在使用
我到处寻找一个很好的解决方案来检查UWP应用程序的文件夹或文件是否被锁定。我发现的大多数东西都是用某种流写的。经过长时间的搜索,我发现了一篇评级较低的帖子,指出如果内容正在使用,Windows将不允许重命名文件夹或文件 我意识到处理这种情况的最好方法是通过适当的异常使用,但我有一个应用程序,它可以存档文件,但不能在文件打开后删除原始文件夹。这会产生各种无法处理的意外结果,包括原始用户数据丢失C# 如何检查文件夹或文件是否已锁定、打开或正在使用,c#,uwp,C#,Uwp,我到处寻找一个很好的解决方案来检查UWP应用程序的文件夹或文件是否被锁定。我发现的大多数东西都是用某种流写的。经过长时间的搜索,我发现了一篇评级较低的帖子,指出如果内容正在使用,Windows将不允许重命名文件夹或文件 我意识到处理这种情况的最好方法是通过适当的异常使用,但我有一个应用程序,它可以存档文件,但不能在文件打开后删除原始文件夹。这会产生各种无法处理的意外结果,包括原始用户数据丢失 因此,我发布了这些我发现有效的快速解决方案,希望它能帮助其他人摆脱无休止的搜索。// /// <s
因此,我发布了这些我发现有效的快速解决方案,希望它能帮助其他人摆脱无休止的搜索。
//
/// <summary>
/// Check if StorageFile is locked. Return true if locked, false otherwise.
/// </summary>
/// <param name="StorageFileToCheck">StorageFile to check if locked.</param>
/// <returns></returns>
public static async Task<Boolean> StorageFileLocked(StorageFile StorageFileToCheck)
{
// If StorageFileToCheck can't be deleted, then rename attempt will cause System.UnauthorizedAccessException indicating StorageFileToCheck is locked.
string stringFilenameTemp = Guid.NewGuid().ToString("N") + StorageFileToCheck.FileType;
string stringFilenameOrig = StorageFileToCheck.Name;
Debug.WriteLine($"StorageFileLocked(): stringFoldernameTemp={stringFilenameTemp}");
Debug.WriteLine($"StorageFileLocked(): stringFoldernameOrig={stringFilenameOrig}");
try
{
// Try to rename file. If file is locked, then System.UnauthorizedAccessException will occur.
await StorageFileToCheck.RenameAsync(stringFilenameTemp);
await StorageFileToCheck.RenameAsync(stringFilenameOrig); // Restore original name if no excpetion.
Debug.WriteLine($"StorageFileLocked(): Returned false since no exception.");
return false; // Return false since no exception. File is not locked.
}
catch (Exception ex)
{
Debug.WriteLine($"StorageFileLocked(): Returned true since exception occurred. Type={ex.GetType()}");
return true; // Return true since exception. File is locked.
}
}
/// <summary>
/// Check if StorageFolder is locked. Return true if locked, false otherwise.
/// </summary>
/// <param name="StorageFolderToCheck">StorageFolder to check if locked.</param>
/// <returns></returns>
public static async Task<Boolean> StorageFolderLocked(StorageFolder StorageFolderToCheck)
{
// If StorageFolderToCheck can't be deleted, then rename attempt will cause System.UnauthorizedAccessException indicating StorageFolderToCheck is locked.
string stringFoldernameTemp = Guid.NewGuid().ToString("N");
string stringFoldernameOrig = StorageFolderToCheck.Name;
Debug.WriteLine($"StorageFolderLocked(): stringFoldernameTemp={stringFoldernameTemp}");
Debug.WriteLine($"StorageFolderLocked(): stringFoldernameOrig={stringFoldernameOrig}");
try
{
// Try to rename folder. If folder is locked, then System.UnauthorizedAccessException will occur.
await StorageFolderToCheck.RenameAsync(stringFoldernameTemp);
await StorageFolderToCheck.RenameAsync(stringFoldernameOrig); // Restore original name if no excpetion.
Debug.WriteLine($"StorageFolderLocked(): Returned false since no exception.");
return false; // Return false since no exception. Folder is not locked.
}
catch (Exception ex)
{
Debug.WriteLine($"StorageFolderLocked(): Returned true since exception occurred. Type={ex.GetType()}");
return true; // Return true since exception. Folder is locked.
}
}
///检查StorageFile是否已锁定。如果锁定,则返回true,否则返回false。
///
///要检查是否已锁定的StorageFile。
///
公共静态异步任务StorageFileLocked(StorageFile StorageFileToCheck)
{
//如果无法删除StorageFileToCheck,则重命名尝试将导致System.UnauthorizedAccess异常,表明StorageFileToCheck已锁定。
字符串stringFilenameTemp=Guid.NewGuid().ToString(“N”)+StorageFileToCheck.FileType;
字符串stringFilenameOrig=StorageFileToCheck.Name;
WriteLine($“StorageFileLocked():stringFoldernameTemp={stringFilenameTemp}”);
WriteLine($“StorageFileLocked():stringFoldernameOrig={stringFilenameOrig}”);
尝试
{
//尝试重命名文件。如果文件被锁定,则会发生System.UnauthorizedAccessException。
等待StorageFileToCheck.RenameAsync(stringFilenameTemp);
等待StorageFileToCheck.RenameAsync(stringFilenameOrig);//如果没有例外,则恢复原始名称。
WriteLine($“StorageFileLocked():返回false,因为没有异常。”);
return false;//返回false,因为没有异常。文件未锁定。
}
捕获(例外情况除外)
{
Debug.WriteLine($”StorageFileLocked():在发生异常后返回true。Type={ex.GetType()}”);
return true;//由于exception.File被锁定,因此返回true。
}
}
///
///检查StorageFolder是否已锁定。如果锁定,则返回true,否则返回false。
///
///StorageFolder以检查是否已锁定。
///
公共静态异步任务StorageFolderLocked(StorageFolder StorageFolderToCheck)
{
//如果无法删除StorageFolderToCheck,则重命名尝试将导致System.UnauthorizedAccess异常,表明StorageFolderToCheck已锁定。
字符串stringFoldernameTemp=Guid.NewGuid().ToString(“N”);
字符串stringFoldernameOrig=StorageFolderToCheck.Name;
WriteLine($“StorageFolderLocked():stringFoldernameTemp={stringFoldernameTemp}”);
WriteLine($“StorageFolderLocked():stringFoldernameOrig={stringFoldernameOrig}”);
尝试
{
//尝试重命名文件夹。如果文件夹被锁定,则会发生System.UnauthorizedAccessException。
等待StorageFolderToCheck.Rename同步(stringFoldernameTemp);
等待StorageFolderToCheck.RenameAsync(stringFoldernameOrig);//如果没有执行,则恢复原始名称。
WriteLine($“StorageFolderLocked():返回false,因为没有异常。”);
return false;//返回false,因为没有异常。文件夹未锁定。
}
捕获(例外情况除外)
{
Debug.WriteLine($”StorageFolderLocked():自发生异常后返回true。Type={ex.GetType()}”);
return true;//异常后返回true。文件夹已锁定。
}
}
“因此,我发布了这些我发现有效的快速解决方案,希望它能帮助其他人摆脱无休止的搜索。”->那么你是在问和回答你自己的问题吗?如果你是,那很好,但我只是想澄清一下,因为目前还没有答案。哪些文件夹要存档?我问这个问题,因为UWP应用程序限制了对文件系统的访问,所以除了库中的文件(需要在appx清单中显式声明)之外,它无法访问其他文件。如果要将文件归档到应用程序的appdata文件夹中,则只有应用程序本身才有权访问该文件夹,因此一般来说,您无需担心文件被其他进程打开。