gpt4 book ai didi

c# - 删除文件前几个字节的最快方法

转载 作者:行者123 更新时间:2023-11-30 22:35:43 25 4
gpt4 key购买 nike

我正在使用 windows mobile compact edition 6.5 手机,正在从蓝牙将二进制数据写入文件。这些文件变得相当大,16M+,我需要做的是一旦文件被写入,然后我需要在文件中搜索开始字符,然后删除之前的所有内容,从而消除垃圾。由于图形问题和速度,当我收到大量数据并且传入数据的条件已经太多时,我无法在数据传入时内联执行此操作。我认为最好是发布过程。无论如何,这是我的困境,搜索起始字节的速度和文件的重写有时需要 5 分钟或更长时间......我基本上将文件移至临时文件,通过它解析并重写一个全新的文件。我必须逐字节执行此操作。

private void closeFiles() {
try {

// Close file stream for raw data.
if (this.fsRaw != null) {
this.fsRaw.Flush();
this.fsRaw.Close();

// Move file, seek the first sync bytes,
// write to fsRaw stream with sync byte and rest of data after it
File.Move(this.s_fileNameRaw, this.s_fileNameRaw + ".old");
FileStream fsRaw_Copy = File.Open(this.s_fileNameRaw + ".old", FileMode.Open);
this.fsRaw = File.Create(this.s_fileNameRaw);

int x = 0;
bool syncFound = false;

// search for sync byte algorithm
while (x != -1) {
... logic to search for sync byte
if (x != -1 && syncFound) {
this.fsPatientRaw.WriteByte((byte)x);
}
}

this.fsRaw.Close();

fsRaw_Copy.Close();
File.Delete(this.s_fileNameRaw + ".old");
}


} catch(IOException e) {
CLogger.WriteLog(ELogLevel.ERROR,"Exception in writing: " + e.Message);
}
}

一定有比这更快的方法!

------------使用答案的测试时间------------

用一个字节读取和一个字节写入初始测试我的方式:

27 Kb/sec

使用下面的答案和 32768 字节的缓冲区:

321 Kb/sec

使用下面的答案和 65536 字节的缓冲区:

501 Kb/sec

最佳答案

您正在对整个文件进行逐字节复制。由于多种原因,这效率不高。搜索起始偏移量(如果需要两者,则搜索结束偏移量),然后将两个偏移量(或文件的起始偏移量和结尾)之间的全部内容从一个流复制到另一个流。

编辑

您不必阅读全部内容即可制作副本。像这样的东西(未经测试,但你明白了)会起作用。

private void CopyPartial(string sourceName, byte syncByte, string destName)
{
using (var input = File.OpenRead(sourceName))
using (var reader = new BinaryReader(input))
using (var output = File.Create(destName))
{
var start = 0;
// seek to sync byte
while (reader.ReadByte() != syncByte)
{
start++;
}

var buffer = new byte[4096]; // 4k page - adjust as you see fit

do
{
var actual = reader.Read(buffer, 0, buffer.Length);
output.Write(buffer, 0, actual);
} while (reader.PeekChar() >= 0);
}

}

编辑 2

我今天实际上需要类似的东西,所以我决定在不调用 PeekChar() 的情况下编写它。这是我所做工作的核心 - 随意将其与上面的第二个 do...while 循环集成。

            var buffer = new byte[1024];
var total = 0;

do
{
var actual = reader.Read(buffer, 0, buffer.Length);
writer.Write(buffer, 0, actual);
total += actual;
} while (total < reader.BaseStream.Length);

关于c# - 删除文件前几个字节的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7367153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com