2016-01-04 29 views
5

Sto provando a leggere un file di testo denominato thedata.txt che contiene un elenco di parole che voglio utilizzare in un gioco di hangman. Ho provato diversi modi, ma non riesco a capire dove viene posizionato il file, se non del tutto quando viene eseguita l'app. Ho aggiunto il file al mio progetto e ho provato a impostare le proprietà di costruzione sul contenuto e quindi a incorporare la risorsa, ma non a trovare il file. Ho creato un progetto per app universale per Windows 10. Il codice che ho provato si presenta così:come leggere un file di testo nell'app universale di Windows

Stream stream = this.GetType().GetTypeInfo().Assembly.GetManifestResourceStream("thedata.txt"); 
      using (StreamReader inputStream = new StreamReader(stream)) 
      { 
       while (inputStream.Peek() >= 0) 
       { 
        Debug.WriteLine("the line is ", inputStream.ReadLine()); 
       } 
      } 

Ottengo eccezioni. Ho anche cercato di elencare i file in un'altra directory:

string path = Windows.Storage.ApplicationData.Current.LocalFolder.Path; 
      Debug.WriteLine("The path is " + path); 
      IReadOnlyCollection<StorageFile> files = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFilesAsync(); 
      foreach (StorageFile file2 in files) 
      { 
       Debug.WriteLine("Name 2 is " + file2.Name + ", " + file2.DateCreated); 
      } 

non vedo il file non sia ... voglio evitare duro codifica l'elenco dei nomi nel mio programma. Non sono sicuro di quale sia il percorso del file.

risposta

17

il codice è molto semplice, basta utilizzare uno schema valido URI (ms-appx nel tuo caso) e trasformare il vostro WinRT InputStream come un flusso classico .NET:

var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///thedata.txt")); 
using (var inputStream = await file.OpenReadAsync()) 
using (var classicStream = inputStream.AsStreamForRead()) 
using (var streamReader = new StreamReader(classicStream)) 
{ 
    while (streamReader.Peek() >= 0) 
    { 
     Debug.WriteLine(string.Format("the line is {0}", streamReader.ReadLine())); 
    } 
} 

per le proprietà del file incorporato, "Build Azione "deve essere impostato su" Content "e" Copy to Ouput Directory "devono essere impostati su" Do not Copy ".

+0

Il codice sopra fornito da t.ouvre ha risposto alla mia domanda. Ho verificato che funzioni sul mio computer e sul mio emulatore. Grazie per aver risposto alla mia domanda. –

+0

Funziona come un fascino. Grazie – lightstalker89

4

Non è possibile utilizzare i metodi classici NET IO in applicazioni di Windows Runtime, il modo corretto di leggere un file di testo in UWP è:

var file = await ApplicationData.Current.LocalFolder.GetFileAsync("data.txt"); 
var lines = await FileIO.ReadLinesAsync(file); 

Inoltre, non è necessario un percorso fisico di un cartella - da msdn:

non fare affidamento su questa proprietà per accedere a una cartella, a causa di un file system percorso non è disponibile per alcune cartelle. Ad esempio, nei seguenti casi , la cartella potrebbe non avere un percorso del file system oppure il percorso del file system potrebbe non essere disponibile. • La cartella rappresenta un contenitore per un gruppo di file (ad esempio, il valore restituito da alcuni sovraccarichi di del metodo GetFoldersAsync) anziché una cartella effettiva nel sistema . • La cartella è supportata da un URI. • La cartella è stata selezionata da utilizzando un selettore di file.

3

Per ulteriori dettagli, consultare File access permissions. E Create, write, and read a file fornisce esempi relativi con File IO per le applicazioni UWP su Windows 10.

È possibile recuperare un file direttamente dalla cartella locale del app utilizzando un app URI, come questo:

using Windows.Storage; 

StorageFile file = await StorageFile.GetFileFromApplicationUriAsync("ms-appdata:///local/file.txt"); 
+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/10763931) –

+0

Grazie! Aggiornato i frammenti di codice. –