首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Windows 8 開發入門(十二):檔案建立與三種讀寫模式——String、Buffer、Stream

     編輯:關於C#

Windows 8 檔案 IO 提供三種資料寫入/讀取路徑,適用不同效能與記憶體需求:

  • String:簡單文字,FileIO.WriteTextAsync/ReadTextAsync
  • Buffer (IBuffer):二進位區塊,FileIO.WriteBufferAsync/ReadBufferAsync,配合 DataWriter/Reader
  • Stream (IRandomAccessStream):串流隨機存取,OpenTransactedWriteAsync/OpenAsync,支援交易式寫入

前置準備:Manifest 權限

  1. 功能:勾選「文件庫存取」
  2. 宣告 → 檔案類型關聯:新增 .txt 支援
文件庫存取功能勾選
圖 1:Package.appxmanifest 功能索引標籤
檔案類型關聯宣告
圖 2:宣告索引標籤加入 .txt 關聯

前端介面:三組讀寫按鈕

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <TextBox Name="tbFileName" Text="test.txt" .../>
    <TextBox Name="tbContent" Text="預設寫入內容" .../>
    <TextBlock Name="tb_show" .../>

    <Button Name="btnCreateFile" Content="建立檔案" Click="btnCreateFile_Click" .../>
    <Button Name="btnWriteFile_Copy" Content="寫入字串檔案" Click="btnWriteFile_Copy_Click" .../>
    <Button Name="btnReadFile" Content="讀取字串檔案" Click="btnReadFile_Click" .../>

    <Button Name="btnWriteBufferFile" Content="寫入 Buffer 資料" Click="btnWriteBufferFile_Click" .../>
    <Button Name="btnReadBufferFile" Content="讀取 Buffer 資料" Click="btnReadBufferFile_Click" .../>

    <Button Name="btnWriteStreamFile" Content="寫入 Stream 資料" Click="btnWriteStreamFile_Click" .../>
    <Button Name="btnReadStreamFile" Content="讀取 Stream 資料" Click="btnReadStreamFile_Click" .../>
</Grid>

完整後端實作

public sealed partial class MainPage : Page {
    // 取得文件庫資料夾
    StorageFolder storageFolder = KnownFolders.DocumentsLibrary;

    // === String 模式 ===
    private async void btnCreateFile_Click(object sender, RoutedEventArgs e) {
        var file = await storageFolder.CreateFileAsync(tbFileName.Text.Trim(), CreationCollisionOption.ReplaceExisting);
        tb_show.Text = $"提示:建立了檔案--{tbFileName.Text.Trim()}";
    }

    private async void btnWriteFile_Copy_Click(object sender, RoutedEventArgs e) {
        try {
            var content = tbContent.Text.Trim() + "文字模式";
            var file = await storageFolder.GetFileAsync(tbFileName.Text.Trim());
            await FileIO.WriteTextAsync(file, content);
            tb_show.Text = $"提示:檔案寫入成功,內容為「{content}」";
        } catch { tb_show.Text = "提示:未找到該檔案,請先建立檔案"; }
    }

    private async void btnReadFile_Click(object sender, RoutedEventArgs e) {
        try {
            var file = await storageFolder.GetFileAsync(tbFileName.Text.Trim());
            var content = await FileIO.ReadTextAsync(file, UnicodeEncoding.Utf8);
            tb_show.Text = $"提示:檔案以字串方式讀取成功,內容為「{content}」";
        } catch { tb_show.Text = "提示:未找到該檔案,請先建立檔案"; }
    }

    // === Buffer 模式 ===
    private async void btnWriteBufferFile_Click(object sender, RoutedEventArgs e) {
        try {
            var content = tbContent.Text.Trim() + "Buffer模式";
            var file = await storageFolder.GetFileAsync(tbFileName.Text.Trim());
            var buffer = GetBufferFromString(content);
            await FileIO.WriteBufferAsync(file, buffer);
            tb_show.Text = $"提示:檔案寫入成功,內容為「{content}」";
        } catch { tb_show.Text = "提示:未找到該檔案,請先建立檔案"; }
    }

    private async void btnReadBufferFile_Click(object sender, RoutedEventArgs e) {
        var file = await storageFolder.GetFileAsync(tbFileName.Text.Trim());
        var buffer = await FileIO.ReadBufferAsync(file);
        using (var reader = DataReader.FromBuffer(buffer)) {
            var content = reader.ReadString(buffer.Length);
            tb_show.Text = $"提示:檔案以 Buffer 方式讀取成功,內容為「{content}」";
        }
    }

    // String → IBuffer 轉換
    private IBuffer GetBufferFromString(string str) {
        using (var ms = new InMemoryRandomAccessStream())
        using (var writer = new DataWriter(ms)) {
            writer.WriteString(str);
            return writer.DetachBuffer();
        }
    }

    // === Stream 模式(交易式寫入) ===
    private async void btnWriteStreamFile_Click(object sender, RoutedEventArgs e) {
        try {
            var content = tbContent.Text.Trim() + "Stream模式";
            var file = await storageFolder.GetFileAsync(tbFileName.Text.Trim());
            using (var tx = await file.OpenTransactedWriteAsync())
            using (var writer = new DataWriter(tx.Stream)) {
                writer.WriteString(content);
                tx.Stream.Size = await writer.StoreAsync();
                await tx.CommitAsync();
                tb_show.Text = $"提示:檔案寫入成功,內容為「{content}」";
            }
        } catch { tb_show.Text = "提示:未找到該檔案,請先建立檔案"; }
    }

    private async void btnReadStreamFile_Click(object sender, RoutedEventArgs e) {
        var file = await storageFolder.GetFileAsync(tbFileName.Text.Trim());
        using (var stream = await file.OpenAsync(FileAccessMode.Read))
        using (var reader = new DataReader(stream)) {
            var size = stream.Size;
            if (size <= UInt32.MaxValue) {
                var loaded = await reader.LoadAsync((UInt32)size);
                var content = reader.ReadString(loaded);
                tb_show.Text = $"提示:檔案以 Stream 方式讀取成功,內容為「{content}」";
            }
        }
    }
}

注意:所有使用 await 的方法必須標記 async 關鍵字。

原始碼下載:Win8File.rar(VS2012 + Windows 8)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved