2011年11月8日 星期二

利用 FileStream 讀檔、寫檔


在 C# 裡,透過 FileStream 可以很容易地完成檔案的讀/寫動作,有時候真的會覺得,它其實不難,但真要從無到有卻沒得參考還真的有點不方便,所以整理了一下基本的使用方式。更多有關檔案操作方法,可以參考《[C#] 檔案讀寫》這篇文章,寫得很詳細。


/// 
/// 將檔案寫到 Byte[]
/// 
/// 

/// 
private byte[] File2Byte(string strFilePath)
{
    FileStream fileStream = null;
    Byte[] fileBytes = null;

    if (File.Exists(strFilePath))
    {
        try
        {
            fileStream = new FileStream(strFilePath, FileMode.Open, FileAccess.ReadWrite);
            fileBytes = new byte[(int)fileStream.Length]; //設定 fileBytes 的長度
            fileStream.Read(fileBytes, 0, fileBytes.Length); //將 filestream 資料讀到 fileBytes 
        }
        catch
        {
                    
        }
        finally
        {
            fileStream.Close();
            fileStream.Dispose();
        }
    }

    return fileBytes;
}


在 MSDN 的《FileStream 類別》有提到:「請確定對所有 FileStream 物件呼叫 Dispose 方法,尤其是在磁碟空間有限的環境中更應如此。如果沒有可用的磁碟空間,且在 FileStream 完成之前沒有呼叫 Dispose 方法,則執行 IO 作業可能會引發例外狀況。」雖然目前沒有直接可實驗的環境,就姑且信之,乖乖的加上一行 Dispose。

/// 
/// 將 Byte[] 資料寫到檔案
/// 
/// 

/// 

/// 
private bool Byte2File(byte[] bRead, string strNewFilePath)
{
    FileStream fileStream = null;
    try
    {
        fileStream = new FileStream(strNewFilePath, FileMode.OpenOrCreate);
        fileStream.Write(bRead, 0, bRead.Length);
    }
    catch(Exception ex)
    {
        Response.Write(ex.Message);
        return false;
    }
    finally
    {
        fileStream.Close();
        fileStream.Dispose();
    }

    return true;
}


呼叫讀檔/寫檔函式:
protected void btnFile2Byte_Click(object sender, EventArgs e)
{
    //設定檔案來源
    //string strFilePath = "D:\\upload\\projAply\\ann_e3wdwz10.xls";
    string strFilePath = @"D:\upload\projAply\ann_e3wdwz10.xls";

    //將來源檔案寫到 Byte[] bRead
    Byte[] bRead= File2Byte(strFilePath);

    //將 Byte[]  bRead 裡的資料寫到檔案
    Byte2File(bRead, "D:\\upload\\projAply\\ann_test.xls");
}


在設定檔案來源的地方,特別用了一個 「@」符號,其實是故意的。主要是想要特別分享這個好方法。原先使用單純的字串時,如果遇到反斜線(\)時,則必須使用雙反斜線(\\)來代表。但如果在字串前面加上 @ 符號後,後面的字串除了引號(")需要改用雙引號("")來替換之外,就不再需要考慮逸出字元的處理了,甚至連跨越數行都沒有問題。詳見:C#中的@符號


Ref:

01.
[C#] 檔案讀寫
http://blog.xuite.net/autosun/study/32576568

02.
FileStream 類別
http://msdn.microsoft.com/zh-tw/library/system.io.filestream(v=vs.80).aspx

03.
C# byte[]和文件FileStream相互转化
http://www.cnblogs.com/wskfire/archive/2007/11/30/978212.html

04.
C#中的@符號
http://tc.wangchao.net.cn/bbs/detail_149142.html

05.
2.4.4.5 字串常值
http://msdn.microsoft.com/zh-tw/library/aa691090(v=vs.71).aspx

06.
C# 字串變數, 如何包含雙引號或反斜線
http://www.allenkuo.com/GenericArticle/view.aspx?id=28

沒有留言:

張貼留言