0

我有以下代码:

private async Task <string>IsolatedStorageReadTextFile(string uFileName)
{
        string sRet = "";

        StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName);
        if (file != null)
        {
            using (var inputStream = await file.OpenReadAsync())
            using (var classicStream = inputStream.AsStreamForRead())
            using (var streamReader = new StreamReader(classicStream))
            {
                while (streamReader.Peek() >= 0)
                {
                    sRet = streamReader.ReadLine();
                }
            }
        }
        return sRet;
}

当相关文件不存在时,IDE 会抛出错误:

在此处输入图像描述

我是不是该

1)让IDE调试警告器忽略这个错误(说“不要打破这个异常”),我应该让“if(file!= null)”完成这项工作

2)或者我应该检查文件是否真的存在

3)使用try-catch?

我不得不根据答案添加代码的重要部分:

    private async Task <bool> LocalExists(string uFileName)
    {
        bool b = false;
        //https://stackoverflow.com/questions/8626018/how-to-check-if-file-exists-in-a-windows-store-app
        try
        {
            StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(uFileName);
            b = (file != null);
        }
        catch (Exception ex)
        {
            b = false;
        }

        return b;
    }

这会引发相同的异常,因为在 UWP 中,除了尝试访问文件之外,似乎没有其他方法可以检查文件是否实际存在:

如何检查文件是否存在于 Windows 应用商店应用程序中?

所以问题仍然存在。

4

3 回答 3

2

您应该检查文件是否存在,除非它应该始终存在,例如因为它是您程序的一部分。尽管如此,您应该使用 try catch 来处理整个事情,因为即使文件存在,它也可能被锁定或发生不同的读取错误。

于 2017-11-25T13:50:55.147 回答
2

在您提出的三个解决方案中(忽略错误,先检查文件是否存在,或捕获异常),只有捕获异常才有效。忽略异常将使应用程序崩溃。在调用 GetFileAsync 之前检查文件是否存在存在时间问题,即文件可能在检查之后但在打开之前被删除。

第四个也是最好的解决方案是使用StorageFile.TryGetItemAsync如果文件存在则返回该文件,如果不存在则返回 null。

StorageFile file = await ApplicationData.Current.LocalFolder.TryGetItemAsync(uFileName) as StorageFile;
if (file != null)
{
    //...
}

链接的线程表示无法检查 2011 年的 Windows 应用商店应用程序是否正确。2017 年的 UWP 应用程序已过时。

于 2017-11-26T00:47:36.007 回答
1

您可以检查文件之前是否存在,或处理异常。

当您没有捕获异常时,将不会执行下一行,因此您无法检查文件是否为空(不像其他编程语言,如 C++)。

选项,不要在此选项上中断,仅在抛出异常时不暂停(激活断点)应用程序,不会改变程序的行为。

于 2017-11-25T13:48:28.513 回答