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

WinRtにはFile.Existsがないため、(リンクされた質問GetFileAsyncのように)を使用し、ブランチで初期化ロジックを実行する方が良いと思います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メソッドが存在しません) 。

于 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 に答える