2015-05-26 5 views
0

Мне нужно получить список всех файлов на устройстве (телефоне или ПК) в моем универсальном приложении. В МОФ я somesing так:winrt Как получить список файлов с устройства с помощью C#

class Collection { 
    private StringCollection seachResults; 
    //find all mp3 files in local storage 
    private void ScanDrives() { 
     seachResults.Clear(); 
     string[] drives = Environment.GetLogicalDrives(); 
     foreach (string dr in drives) { 
      DriveInfo di = new DriveInfo(dr); 
      if (!di.IsReady) { 
       //skip if drive not ready 
       continue; 
      } 
      DirectoryInfo rootDir = di.RootDirectory; 
      WalkDirectoryTree(rootDir); 
     } 
    } 

    private void WalkDirectoryTree(DirectoryInfo root) { 
     FileInfo[] files = null; 
     DirectoryInfo[] subDirs = null; 
     try { 
      files = root.GetFiles("*.mp3"); 
     } catch (UnauthorizedAccessException e) { 

     } catch (DirectoryNotFoundException e) { 

     } 

     if (files != null) { 
      foreach (FileInfo fileInfo in files) { 
       seachResults.Add(fileInfo.FullName); 
      } 
      subDirs = root.GetDirectories(); 
      foreach (DirectoryInfo dirInfo in subDirs) { 
       WalkDirectoryTree(dirInfo); 
      } 
     } 
    } 
} 

Но когда я пытаюсь перенести это в WinRT приложение, которое я получаю несколько ошибок, как unknown type Drive и unexisted method Environment.GetLogicalDrives().

Может ли кто-нибудь сказать, как это сделать в winRT?

+0

Environment.GetLogicalDrives(); Я работаю только в win32 или win64. Вы пробовали GetLogicalDrives() системы System.IO? – ApolloSoftware

ответ

1

Вы не найдете способ получения всех логических дисков в приложении WinRT; Приложения WinRT существуют в изолированной среде и будут иметь доступ только к их изолированному хранилищу или к известным папкам (например, к музыке), если они объявлены как возможность в манифесте приложения.

Например, чтобы получить доступ к музыкальной папке пользователя вы можете сделать это (не забудьте объявить возможности в приложении проявленной):

StorageFolder folder = Windows.Storage.KnownFolders.MusicLibrary; 

Единственный способ получить доступ к любому другому частью файловой системы является то, что пользователь конкретно предоставляет доступ через сборщик файлов:

var folderPicker = new FolderPicker(); 
var folder = await folderPicker.PickSingleFolderAsync(); 
+0

Спасибо. Можете ли вы сказать мне, будут ли файлы мультимедиа сохранены во флэш-памяти, будут ли они автоматически добавляться в музыкальную библиотеку (если устройство является телефоном)? – Alex

+0

Да, StorageFolder, возвращаемый KnownFolders.MusicLibrary, является виртуальной папкой, и запрос на него возвращает файлы, которые хранятся как на внутреннем, так и на съемном носителе. Если по какой-либо причине музыкальные файлы, которые вам нужны для доступа, находятся за пределами стандартной музыкальной папки на SD-карте, тогда вы можете получить доступ к SD-карте - https://msdn.microsoft.com/en-us /library/windows/apps/xaml/dn611857.aspx - но это не обязательно, если музыка хранится в нужном месте. –

+0

Спасибо. Это все, что мне нужно. – Alex

-1

Вы пробовали System.IO.Directory.GetLogicalDrives()?

Я считаю, что Environment.GetLogicalDrives() работает только для Win32/Win64. Если я не ошибаюсь, System.IO.Directory существует в mscorlib и широко доступен в версиях Phone, RT или Regular.

MSDN от ссылки:

https://msdn.microsoft.com/en-us/library/system.io.directory.getlogicaldrives%28v=vs.110%29.aspx

+0

Я получаю сообщение об ошибке "каталог не существует в пространстве имен System.IO". Тип проекта - портативная библиотека классов. Я читал, что в winRT существует Windows.Storage.Folder вместо System.IO.Directory, но у него нет некоторого метода для получения логического драйвера. – Alex