none
【File.Exists()】为什么文件确实存在但 Exists() 方法返回 false? RRS feed

  • 问题

  • 我想判断应用程序存储的某个存储区是否存在某个文件,例如我想判断 

    ApplicationData.Current.TemporaryFolder

    文件夹中是否存在 xxx.txt 文件,我的判断代码是:

    return File.Exists("ms-appdata:///temp/xxx.txt");
    
    我发现 xxx.txt 文件确实是存在的,但 Exists() 方法却返回 false,这是为什么?

    2015年9月25日 3:39

答案

  • 可以这样理解。

    我们经常在XAML中用ms-appdata这种形式去定位文件,而ms-appdata:///temp/这种形式其实是一种访问协议。

    XAML的代码解析过程中,会解析这个协议,访问到temp协议对应的路径。而在C#代码的File.Exists方法中,参数要求是绝对路径,就像你上面提到的,它是不能正确解析协议的。


    希望我的答案能帮助更多的人。

    2015年9月25日 7:25
    版主

全部回复

  • Hi, CodingNinja10

    判断临时目录文件存在,可以这样拼接文件路径:

    string path = Path.Combine(ApplicationData.Current.TemporaryFolder.Path, "***.txt");
    bool exists = File.Exists(path);


    希望我的答案能帮助更多的人。

    2015年9月25日 5:44
    版主
  • 嗯,但这衍生出另一个问题,

    string path = Path.Combine(ApplicationData.Current.TemporaryFolder.Path, "***.txt");

    获取的地址是这个:

    "C:\\Users\\MyName\\AppData\\Local\\Packages\\5d40d80a-xxxx-xxxx-xxxx-efd339ad5614_pmc9e0yzdvsd2\\TempState\\xxx.txt"

    File.Exists(path);

    能正确判断了!

    但我们知道 WP8/8.1/10 都是可以用形如:

    ms-appx:///

    ms-appdata://local/

    ms-appdata:///roaming/

    ms-appdata:///temp/

    的地址格式的,而我也需要用这一格式。

    用“ms-xxx”这一种格式之所以无法判断文件存在,我的猜想是:

    File.Exists(path);

    方法无法使用这一格式,“ms-xxx”这一格式只是一个“简写”,而不是真实地址。Exits() 方法是需要正常的、真实的地址。

    我的猜想正确吗?

    2015年9月25日 6:57
  • 可以这样理解。

    我们经常在XAML中用ms-appdata这种形式去定位文件,而ms-appdata:///temp/这种形式其实是一种访问协议。

    XAML的代码解析过程中,会解析这个协议,访问到temp协议对应的路径。而在C#代码的File.Exists方法中,参数要求是绝对路径,就像你上面提到的,它是不能正确解析协议的。


    希望我的答案能帮助更多的人。

    2015年9月25日 7:25
    版主