Я использую телефон Windows Mobile Compact Edition 6.5 и записываю двоичные данные в файл из Bluetooth. Эти файлы становятся довольно большими, 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
memmove()
и сбросьте изменения, усекая. - person Kerrek SB   schedule 10.09.2011