2016-09-14 6 views
0

Я знаю, что это может быть дубликат, но другие вопросы, которые я нашел по этой теме, недостаточно описывают мою проблему.Проверьте, существует ли файл в UWP

public bool FileExists(string filename) 
    { 
     try 
     { 
      if (filename != null) 
      { 
       // folder where the file is 
       StorageFolder folder = ApplicationData.Current.LocalFolder; 

       // check if file exists 
       if (folder.TryGetItemAsync(filename) != null) 
        return true; 
       return false; 
      } 
      return false; 
     } 
     catch (Exception e) 
     { 
      // do stuff 
     } 
    } 

Моя проблема в том, что этот метод всегда возвращает true. TryGetItemAsync(string name) должен вернуть значение null, если файл не найден. Вместо этого он возвращает System.__ComObject, независимо от того, является ли мое имя параметра фактическим файлом или нет.

У меня есть несколько раз проверено, что файл существует в моем folder.

Может ли кто-нибудь объяснить поведение, которое он всегда возвращает System.__ComObject?

EDIT 1: Некоторые больше информации:

В моем main классе, я проверяю это так:

Debug.WriteLine("Existing file = " + fileUtils.FileExists("Testfile1.txt")); 
Debug.WriteLine("Not-Existing file = " + fileUtils.FileExists("Testfile2.txt")); 

Как вы можете видеть, файл существует в папке (и папка в моем коде имеет правильный путь, который ведет к этой папке): folder

ответ

2

folder.TryGetItemAsync() возвращает TResu л объект, который хранит операция не является результатом операции

, чтобы получить результат просто использовать ждут

var result = await folder.TryGetItemsAsync(filename); 

или

var tRes = folder.TryGetItemsAsync(filename); 
var outputFile = tRes.GetResults(); 
+0

Благодарим вас за разъяснение, оно решило мою проблему :) –

1

TryGetItemAsync представляет собой асинхронный метод. Вам нужно использовать ключевое слово ожидания, если вы хотите получить результат операции вместо самой операции.

Вместо:

if (folder.TryGetItemAsync(filename) != null) 

Вы можете использовать:

var myFile=await folder.TryGetItemAsync(filename) 
if(myFile!=null) 
+0

Вы правы, спасибо. Но в моем случае метод 'FileExists' должен быть синхронным методом. Вот почему я отметил ответ RTDev как принятый ответ, потому что он показал способ оставаться синхронным. –

0

File.Exists просто работает в Windows, ВГД и Windows, тоже.

File.Exists(Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path,"Testfile1.txt"); 
Смежные вопросы