2012-10-06 57 views
2

我想打開一個文件它,如果它不存在,創建它,類似於this問題的WinRT創建一個文件,如果不存在,並知道該文件的創建

是如果文件是新創建的,我執行一些額外的初始化邏輯。

我可以使用

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

回答

1

隨着使用CreationCollsionOption.OpenIfExists沒有辦法告訴發生了什麼以外望CreatedDate或文件的Size

因此,我認爲你是更好,如果你使用GetFileAsync(像linked question),做你的initilaize邏輯在catch FileNotFoundException分支,因爲沒有File.Exists in WinRt

但是存在這樣的情況,你列舉的第三個解決方案目錄中的文件,並用手檢查是否存在:

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

注:在這種情況下,可能你必須準備處理競爭條件becase的它可以在您正在處理的文件列表一個你之前創建的文件發生(那是wh Ÿ沒有File.Exists方法存在)

+0

有關如何處理FileNotFoundException的任何建議,因爲我無法在catch塊內等待? – cordialgerm

+0

然後設置一個標記,例如'fileNotExtists'在catch塊TRUE;然後外面基礎上,你可以'await' ... – nemesv

+0

感謝..這是一個有點明顯..它必須晚了國旗的捕撈 – cordialgerm

1

我也有類似的情況,我想,以確定是否一個應用程序是首次運行。以下是我如何接近它。

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

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