久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C#:NET4.0中如何使用內(nèi)存映射操作大文件

 羊玉wngbx 2019-01-30

以下代碼在執(zhí)行的時候,,最終讀取的結(jié)果并不是文件test.txt中的內(nèi)容,。
不知道哪里碼錯了,,還請大家?guī)兔χ更c下,。

MemoryMappedFile memoryFile = MemoryMappedFile.CreateFromFile("test.txt", FileMode.OpenOrCreate, "MyFile", FILE_SIZE);
accessor1 = memoryFile.CreateViewAccessor(0, FILE_SIZE / 2);
StringBuilder sb = new StringBuilder(FILE_SIZE);
for (int i = 0; i < FILE_SIZE / 2; i++)
{
    char ch = accessor1.ReadChar(i);
    sb.Append(ch);
}
MessageBox.Show(sb.ToString());
tm07 9
2015-01-22 提問
1 個回答
0

已采納

你的test.txt里面存的是什么樣的文本,?編碼格式是什么,?這些都決定了你讀出來的內(nèi)容是否正確,。這段程序只有在UTF-16編碼的文本中能讀出你想要的內(nèi)容,因為.NET的char是unicode的,。如果你不是用UTF-16編碼,比如前兩個字符是ab,,ReadChar會把ab一起讀出來當成一個unicode字符,,天知道那會是什么結(jié)果。而且如果是ReadChar的話一次讀兩個字節(jié),,你怎么可以i++呢,,至少要i+=2吧。另外很多文本文件(至少要windows中)前幾個字節(jié)是BOM標志,。你也沒處理,。

所以,,最簡單的辦法是用CreateViewStream而不是CreateViewAccessor,然后用StreamReader指定Encoding去讀,。

var filePath = @"D:\junk\test.txt";
var fileSize = new FileInfo(filePath).Length;
var viewSize = fileSize / 2;

using (var mm = MemoryMappedFile.CreateFromFile(filePath, FileMode.Open, null, 0, MemoryMappedFileAccess.Read))
using (var stream = mm.CreateViewStream(0, viewSize, MemoryMappedFileAccess.Read))
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
    Console.WriteLine(reader.ReadToEnd());
}

如果非要用Accessor,,那這么寫,但是BOM沒處理,,前幾個字符是亂碼

var filePath = @"D:\junk\test.txt";
var fileSize = new FileInfo(filePath).Length;
var viewSize = fileSize / 2;

using (var mm = MemoryMappedFile.CreateFromFile(filePath, FileMode.Open, null, 0, MemoryMappedFileAccess.Read))
using (var accessor = mm.CreateViewAccessor(0, viewSize, MemoryMappedFileAccess.Read))
{
    byte[] bytes = new byte[viewSize];
    for (int i = 0; i < viewSize; i++)
    {
        bytes[i] = accessor.ReadByte(i);
    }

    var results = Encoding.UTF8.GetString(bytes);
    Console.WriteLine(results);
}

另外:

  1. 你是想要從已經(jīng)存在的文件里讀取數(shù)據(jù),,那么FileMode就不要OpenOrCreate,用Open就好了,。不然文件不存在重新創(chuàng)建了一個,,你讀一堆0出來沒有意義。

  2. 如果不是為了和其它進程共享,,mapName可以傳null,。

  3. 如果只是讀文件,fileSize的參數(shù)可以傳0,,系統(tǒng)會自動match文件的真實大小,。

  4. 對于實現(xiàn)了IDisposible的類,記得用using,,或者在finally里dispose掉,。  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多