回答

26

根據this post中接受的答案,目前沒有其他辦法。但是,File IO團隊正在考慮更改api,以便它返回null而不是拋出異常。從鏈接後

報價:

目前唯一的方法來檢查文件是否存在,是爲了趕上 FileNotFoundException異常。正如已經指出有一個明確的 檢查和開放是一個競爭條件,因此我不希望 有任何文件存在API的添加。我相信文件IO團隊 (我不在該團隊,所以我不知道肯定,但這是我聽到 )正在考慮讓此API返回null,而不是拋出 如果文件不存在。

+2

我相信,在Windows 8.1的地址本新IsAvailable財產。 – satur9nine 2013-09-04 17:52:59

+0

@ satur9nine - 謝謝,很高興知道。我還沒有機會查看8.1 API。 – keyboardP 2013-09-05 21:08:03

+4

ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName)現在可以做到這一點。不需要更難以處理的異常處理。請記住,這也是一個等待電話。 – RBT 2015-04-06 06:24:29

1

我試着寫我自己使用的老把戲:

  1. GetFileAttributesEx()似乎總是如果通過FileOpenPicker選定的文件與ERROR_ACCESS_DENIED結束了;
  2. 同上FindFirstFileEx();
  3. _stat()通過FileOpenPicker選擇文件時,總是以ENOENT結尾;
  4. CreateFile2()with CREATE_NEW選項有效 - 如果文件存在,它將失敗,返回值爲INVALID_HANDLE_VALUE,最後一個ERROR_FILE_EXISTS錯誤;如果文件不存在,則必須記得之後刪除創建的文件。

總之 - 您最好堅持使用異常處理方法。

3

您可以使用舊的Win32調用像這樣的測試,如果目錄中存在與否:

GetFileAttributesExW(path, GetFileExInfoStandard, &info); 

return (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? false: true; 

它可以在臺式機和地鐵應用: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364946%28v=vs.85%29.aspx

+0

這似乎是訣竅 - 非常感謝! – McGarnagle 2013-07-14 22:55:50

+0

FILE_ATTRIBUTE_DIRECTORY來自哪裏?我測試了這個功能,它可以工作,但我不知道如何。謝謝! – 2014-05-23 18:10:24

13

這可能是舊的,但它看起來就像他們已經改變了他們希望你接近這個的方式。

您應該嘗試製作文件,然後在文件已存在的情況下退後。 Here是它的文檔。我正在更新,因爲這是我在Google搜索此問題時的第一個結果。

所以,就我而言,我想打開一個文件,或者如果它不存在,就創建它。我所做的是創建一個文件,如果它已經存在,則將其打開。像這樣:

save = await dir.CreateFileAsync(myFile, CreationCollisionOption.OpenIfExists); 
+4

只有在您嘗試使用唯一名稱創建文件時,這纔有效。如果你只是檢查文件的存在,那麼顯然你不想這樣做。 – 2013-06-11 13:09:14

2

的其他手段來檢查是通過讓文件在本地文件夾

var collection = ApplicationData.Current.LocalFolder.GetFilesAsync() 

使用這種方法,然後遍歷集合中的所有元素,並檢查其可用性。

+9

請檢查您的大寫鎖定鍵。 – 2012-09-06 10:25:11

+2

請不要「尖叫」。 – 2012-09-06 10:25:55

3

微軟在Windows 8.1還增加了新的功能,以StorageFile允許用戶工程師,以確定是否可以訪問文件:IsAvailable

+0

不支持_Windows * Phone * 8.1_,僅_Windows 8.1_。我不知道MS在玩什麼。 – 2016-05-02 13:49:02

7

我偶然在由沙善Yerramilli這個博客帖子提供了一個更好的答案。

我已經測試過這個Windows Phone 8,它的工作原理。

public async Task<bool> isFilePresent(string fileName) 
{ 
    var item = await ApplicationData.Current.LocalFolder.TryGetItemAsync(fileName); 
    return item != null; 
} 

對於Windows Phone 8的

public bool IsFilePresent(string fileName) 
{ 
    return System.IO.File.Exists(string.Format(@"{0}\{1}", ApplicationData.Current.LocalFolder.Path, fileName); 
} 

Check if a file exists in Windows Phone 8 and WinRT without exception

+0

「名稱空間」System.IO「中不存在類型或名稱空間名稱'File'(是否缺少程序集引用?)」 – Mike 2014-08-07 00:06:00

+0

您嘗試在以下位置使用它的應用程序類型:Windows Phone 8或Windows RT應用程序? – Jap 2014-08-07 09:42:28

+0

以8.1爲目標的通用Windows/Phone商店應用程序。 另外,雖然你在這裏:你的WP8函數應該只是返回一個布爾,而且它也不需要async關鍵字。 – Mike 2014-08-07 18:15:24

0
:雖然

我在這裏

抄襲答案對於Windows RT應用程序在Windows商店沒有測試

TryGetItemAsync的文檔說,「這個前充足的展示瞭如何檢查文件的存在。「看來這個API正式用於實現這一目的。

1

8.1得到了這樣的東西,我試過了。

var folder = ApplicationData.Current.LocalFolder; 
var file = await folder.TryGetItemAsync("mytext.txt") as IStorageFile; 

if (file == null) 
{ 
    //do what you want 
} 
else 
{ 
    //do what you want 
} 

http://marcominerva.wordpress.com/2013/11/19/how-to-check-if-a-file-exists-in-a-windows-8-1-store-apps-no-more-exception-handling/

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – 2014-11-27 07:55:38

1
Dim myPath As StorageFolder 
    If (From i In Await KnownFolders.MusicLibrary.GetFoldersAsync() Where i.Name = "PodBong").Count = 1 Then 
     myPath = Await KnownFolders.MusicLibrary.GetFolderAsync("PodBong") 
    Else 
     myPath = Await KnownFolders.MusicLibrary.CreateFolderAsync("PodBong") 

    End If 
+0

此代碼將檢查沒有使用和異常的文件夾。 – HippieGeek 2015-10-06 14:47:07

相關問題