スキップしてメイン コンテンツへ

 none
StorageFileをSystem.IO.Streamに直す RRS feed

  • 質問

  • StorageFile file;

    上記の変数に特定のファイルを設定することはできました。

    このファイルを使ったルーチン(このルーチンは、対象ファイルを指定する引数がSystem.IO.Streamである)を使うために、これをSystem.IO.Streamに直したいのですが、

    StorageFileをSystem.IO.Streamに直す方法をご教示ください。


    2018年11月18日 1:55

回答

  • StorageFileはファイルの場所を示しているだけなので、開かないとStreamになりません

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        Windows.Storage.StorageFolder folderobj = Windows.Storage.ApplicationData.Current.LocalFolder;
        var abc = await folderobj.TryGetItemAsync("ABC");
        if(abc == null)
        {
            folderobj = await folderobj.CreateFolderAsync("ABC");
        }
        else
        {
            folderobj = abc as Windows.Storage.StorageFolder;
        }
    
        //StorageFilehはファイルの中身ではなくドライブ、フォルダと同様に在りかを示しているだけ
        Windows.Storage.StorageFile file;
        Windows.Storage.IStorageItem item = await folderobj.TryGetItemAsync("test.txt");
        file = item as Windows.Storage.StorageFile;
        if(item == null)
        {
            //ファイルがないので新たに作る
            file = await folderobj.CreateFileAsync("test.txt");
        }
    
    
        //ファイルを開くことでStreamが得られる
        using(System.IO.Stream stream = await file.OpenStreamForWriteAsync())
        {//書き込みStreamとして開いてみる
            System.IO.StreamWriter sw = new StreamWriter(stream);
            sw.WriteLine(DateTime.Now.ToString("HH:mm:ss") + " OK");
            await sw.FlushAsync();
        }
    
        using(System.IO.Stream stream = await file.OpenStreamForReadAsync())
        {//読み込みStreamとして開いてみる
            System.IO.StreamReader sr = new StreamReader(stream);
            string line = sr.ReadLine();
            if(line == null)
            {
                line = "";
            }
            Windows.UI.Popups.MessageDialog dialog = new Windows.UI.Popups.MessageDialog(line, "OpenStreamForReadAsync");
            await dialog.ShowAsync();
        }
    
        //Windowsランタイムのランダムアクセスストリームとして開いた場合
        using(Windows.Storage.Streams.IRandomAccessStream randomStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
        {
            // AsStream()でSystem.IO.Streamに変換できる
            System.IO.Stream stream = randomStream.AsStream();
            System.IO.StreamReader sr = new StreamReader(stream);
            string line = sr.ReadLine();
            Windows.UI.Popups.MessageDialog dialog = new Windows.UI.Popups.MessageDialog(line, "OpenAsync");
            await dialog.ShowAsync();
        }
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク ナノレス 2018年11月18日 8:46
    2018年11月18日 3:21