我想打开一个文件,如果它不存在则创建它,类似于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);
答案 0 :(得分:1)
使用CreationCollsionOption.OpenIfExists
除了查看文件的CreatedDate
或Size
之外,无法确定发生了什么。
所以我认为如果你使用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);
}