Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查文件夹或文件是否已锁定、打开或正在使用_C#_Uwp - Fatal编程技术网

C# 如何检查文件夹或文件是否已锁定、打开或正在使用

C# 如何检查文件夹或文件是否已锁定、打开或正在使用,c#,uwp,C#,Uwp,我到处寻找一个很好的解决方案来检查UWP应用程序的文件夹或文件是否被锁定。我发现的大多数东西都是用某种流写的。经过长时间的搜索,我发现了一篇评级较低的帖子,指出如果内容正在使用,Windows将不允许重命名文件夹或文件 我意识到处理这种情况的最好方法是通过适当的异常使用,但我有一个应用程序,它可以存档文件,但不能在文件打开后删除原始文件夹。这会产生各种无法处理的意外结果,包括原始用户数据丢失 因此,我发布了这些我发现有效的快速解决方案,希望它能帮助其他人摆脱无休止的搜索。// /// <s

我到处寻找一个很好的解决方案来检查UWP应用程序的文件夹或文件是否被锁定。我发现的大多数东西都是用某种流写的。经过长时间的搜索,我发现了一篇评级较低的帖子,指出如果内容正在使用,Windows将不允许重命名文件夹或文件

我意识到处理这种情况的最好方法是通过适当的异常使用,但我有一个应用程序,它可以存档文件,但不能在文件打开后删除原始文件夹。这会产生各种无法处理的意外结果,包括原始用户数据丢失


因此,我发布了这些我发现有效的快速解决方案,希望它能帮助其他人摆脱无休止的搜索。

//
/// <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文件夹中,则只有应用程序本身才有权访问该文件夹,因此一般来说,您无需担心文件被其他进程打开。