WinRT创建一个文件,如果它不存在并且知道该文件已创建

时间:2012-10-06 05:33:49

标签: c# windows-8 microsoft-metro windows-runtime

我想打开一个文件,如果它不存在则创建它,类似于this问题

catch 是如果文件是新创建的,我会执行一些额外的初始化逻辑。

我可以用

await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists)

如果文件已存在则打开文件,但如何判断此操作的结果是新创建的文件还是仅打开现有文件?这里有最好的做法,还是我一直在查看文件创建日期或文件大小?

理想情况下,代码看起来像这样:

var file = await folder.CreateFileAsync(fileName, CreationCollsionOption.OpenIfExists);

//How can I reliably tell if the file was new?
if (fileIsNew)
  await InitializeFile(file);

2 个答案:

答案 0 :(得分:1)

使用CreationCollsionOption.OpenIfExists除了查看文件的CreatedDateSize之外,无法确定发生了什么。

所以我认为如果你使用GetFileAsync(就像在linked question中一样)并在catch FileNotFoundException分支中执行初始化逻辑,你会更好,因为没有{{3} }

然而,还有第三种解决方案,您可以枚举目录中的文件并手动检查是否存在:

var files = await folder.GetFilesAsync(CommonFileQuery.OrderByName);
var file = files.FirstOrDefault(x => x.Name == fileName);
if (file == null)
{
    file = await GetFilesAsync(fileName);
    await InitializeFile(file);    
}

注意:在这种情况下,您可能需要准备处理竞争条件,因为在您处理文件列表时可能会发生某人在您之前创建文件(这就是为什么不存在File.Exists方法)

答案 1 :(得分:1)

我有类似的情况,我想确定一个应用程序是否第一次运行。这是我接触它的方式。

try
{
    await ApplicationData.Current.LocalFolder.GetFileAsync(FirstRunFile);
}
catch (FileNotFoundException)
{
    isFirstRun = true;
}

if (isFirstRun) {
    // Perform necessary initialization here
    await ApplicationData.Current.LocalFolder.CreateFileAsync(FirstRunFile);
}