web-dev-qa-db-ja.com

Windowsユニバーサルアプリでテキストファイルを読み取る方法

絞首刑執行人のゲームで使用したい単語のリストが含まれているthedata.txtという名前のテキストファイルを読み込もうとしています。さまざまな方法を試しましたが、アプリの実行時にファイルが配置される場所がわかりません。ファイルをプロジェクトに追加し、ビルドプロパティをコンテンツに設定してからリソースを埋め込もうとしましたが、ファイルが見つかりません。 Windows10ユニバーサルアプリプロジェクトを作成しました。私が試したコードは次のようになります。

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

例外が発生します。また、別のディレクトリにあるファイルを一覧表示しようとしました。

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

そこにもファイルが表示されません...プログラムで名前のリストをハードコーディングするのは避けたいです。ファイルが配置されているパスがわかりません。

6
Chris Mason

コードは非常に単純です。有効なスキームURI(この場合はms-appx)を使用し、WinRTInputStreamを従来の.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()));
    }
}

埋め込みファイルのプロパティについては、「ビルドアクション」を「コンテンツ」に設定し、「出力ディレクトリにコピー」を「コピーしない」に設定する必要があります。

20
t.ouvre

Windowsランタイムアプリで従来の.NET IOメソッドを使用することはできません。UWPでテキストファイルを読み取る適切な方法は、次のとおりです。

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

また、フォルダの物理パスは必要ありません-from msdn

一部のフォルダではファイルシステムパスを使用できないため、このプロパティに依存してフォルダにアクセスしないでください。たとえば、次の場合、フォルダにファイルシステムパスがないか、ファイルシステムパスが使用できない可能性があります。 •フォルダーは、ファイルシステム内の実際のフォルダーではなく、ファイルのグループのコンテナー(たとえば、GetFoldersAsyncメソッドの一部のオーバーロードからの戻り値)を表します。 •フォルダはURIでバックアップされています。 •フォルダーは、ファイルピッカーを使用して選択されました。

8
w.b

詳細については、 ファイルアクセス許可 を参照してください。そして ファイルの作成、書き込み、読み取り は、Windows10上のUWPアプリのファイルIO)に関連する例を提供します。

次のように、アプリのURIを使用して、アプリのローカルフォルダーからファイルを直接取得できます。

using Windows.Storage;

StorageFile file = await StorageFile.GetFileFromApplicationUriAsync("ms-appdata:///local/file.txt");  
3
Haibara Ai