web-dev-qa-db-ja.com

Windowsストアアプリにファイルが存在するかどうかを確認する方法は?

Windowsストアアプリにファイルが存在するかどうかを確認する他の方法はありますか?

try
{
    var file = await ApplicationData.Current.LocalFolder.GetFileAsync("Test.xml");
    //no exception means file exists
}
catch (FileNotFoundException ex)
{ 
    //find out through exception 
}
48
Haris Hasan

この投稿 で受け入れられた答えによると、現時点では他に方法はありません。ただし、File IOチームは、例外をスローする代わりにnullを返すようにAPIを変更することを検討しています。

リンクされた投稿からの引用:

現在、ファイルが存在するかどうかを確認する唯一の方法は、FileNotFoundExceptionをキャッチすることです。明示的なチェックがあり、開始が競合状態であることが指摘されているように、APIが追加されたファイルが存在するとは思わない。 File IO team(私はそのチームにいないので、確かにわかりませんが、これは私が聞いたことです))は、このAPIがスローする代わりにnullを返すことを検討していると考えていますファイルが存在しない場合。

26
keyboardP

これは古いかもしれませんが、彼らがあなたにこれに近づく方法を変えたようです。

ファイルを作成してから、ファイルが既に存在する場合は元に戻すことを試みます。 ここ はそのドキュメントです。これは、この問題に対するGoogle検索の最初の結果であったため、これを更新しています。

そのため、私の場合、ファイルを開くか、存在しない場合は作成する必要があります。ファイルを作成し、既に存在する場合はそれを開きます。そのようです:

save = await dir.CreateFileAsync(myFile, CreationCollisionOption.OpenIfExists);
13
Billdr

Shashank Yerramilliによるこのブログ投稿に出くわしました。

Windows Phone 8でこれをテストしましたが、動作します。ただし、Windowsストアではテストしていません

ここに答えをコピーしています

Windowsの場合RT app:

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

例外なくWindows Phone 8およびWinRTにファイルが存在するかどうかを確認します

8
Jap

Microsoftは、Windows 8.1のStorageFileに新しい機能を追加して、ユーザーエンジニアがファイルにアクセスできるかどうかを判断できるようにしました。 IsAvailable

3
satur9nine

このような古い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

3

チェックする他の手段は、ローカルフォルダ内のファイルを取得することです

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

このメソッドを使用して、コレクション内のすべての要素を反復処理し、その可用性を確認します。

2
Anobik
    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
1
HippieGeek

私は古いトリックを使って自分で書いてみました:

  1. FileOpenPickerでファイルを選択した場合、GetFileAttributesEx()は常にERROR_ACCESS_DENIEDで終わるようです。
  2. FindFirstFileEx()についても同様です。
  3. FileOpenPickerでファイルを選択すると、_stat()は常にENOENTになります。
  4. CREATE_NEWオプションを指定したCreateFile2()は機能します-ファイルが存在する場合、INVALID_HANDLE_VALUE戻り値とERROR_FILE_EXISTS最後のエラーで失敗します。ファイルが存在しない場合は、作成したファイルを後で削除することを忘れないでください。

全体として、例外処理メソッドにこだわる方が良いでしょう。

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 /

1
canbax

Try GetItemAsync のドキュメントには、「この例はファイルの存在を確認する方法を示しています。」このAPIは、その目的を果たすために公式に意図されているようです。

0
Thaine Norris