2

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

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

我可以用

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);
4

2 回答 2

1

使用 时,除了查看文件的或CreationCollsionOption.OpenIfExists之外,没有办法知道发生了什么。CreatedDateSize

所以我认为如果你使用GetFileAsync(如在链接的问题中)并在分支中执行你的初始化逻辑,你会更好catch FileNotFoundException,因为WinRt 中没有 File.Exists

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

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存在方法的原因)

于 2012-10-06T06:07:59.187 回答
1

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

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

if (isFirstRun) {
    // Perform necessary initialization here
    await ApplicationData.Current.LocalFolder.CreateFileAsync(FirstRunFile);
}
于 2012-10-06T07:41:43.463 回答