Диск С: выполнил недопустимую операцию и будет закрыт
CONST
MaxSize : Longint = 1440000; //байтfunction ExtractFileNames(FileNames:string):string;
var
S:string;
begin
S:='';
while Pos('.', FileNames) > 0 dobegin
S:=S+Copy(FileNames,1,Pos('.',FileNames)-1);
Delete(FileNames,1,Pos('.',FileNames));
end;
result:=S;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
InFile,OutFile: FILE;
CopyBuffer : POINTER; { buffer for copying }
iRecsOK, iRecsWr, index: Integer;
sFileName,sFileExt,sFileFullName:string;
fFileSize: fileof Byte;
Size:LongInt;
begin
sFileFullName:='C:\1\1.mp3';
sFileName:=ExtractFileName(sFileFullName);
sFileExt:=ExtractFileExt(sFileName);
sFileName:=ExtractFileNames(sFileName);
ShowMessage(sFileFullName+#13+sFilename+#13+sFileExt);
if FileExists(sFileFullName) thenbegin
AssignFile(fFileSize, sFileFullName);
FileMode := 0; {Set file access to read only }
Reset(fFileSize);
Size := FileSize(fFileSize); {Get File Size}
CloseFile(fFileSize);
ShowMessage(IntToStr(Size));
if Size>MaxSize thenbegin{Divide}
Getmem(CopyBuffer, MaxSize); { allocate the buffer }
Assignfile(inFile,sFileFullName );//+ '.ZIP');
Reset(inFile,1);
index := 1;
repeat
AssignFile(outFile,sFileName + '-'+IntToStr(index) + sFileExt);
Rewrite(OutFile,1);
inc(index);
BlockRead(InFile, CopyBuffer^, MaxSize, iRecsOK);
BlockWrite(OutFile, CopyBuffer^, iRecsOK, iRecsWr);
CloseFile(OutFile);
until (iRecsOK < MaxSize);
CloseFile(InFile);
FreeMem(CopyBuffer, MaxSize); { free the buffer }
ShowMessage('Done..!');
endelsebegin
ShowMessage('Do nothing..!');
end;
endelse
ShowMessage('File: '+sFileFullName+' not found');
end;
// Чтобы склеить файлы обратно в один,// можно воспользоваться DOS функцией copy;// copy /b file-1.xxx+file-2.xxx+file-3.xxx file.mp3
Задача - разделить большой файл на более мелкие куски и затем собрать их вновь. Данное кодирование на Delphi предоставляет основную реализацию этой функциональности.
Вот подробный анализ того, что код делает:
Определяется константа MaxSize, представляющая максимальный размер каждого куска (в байтах).
Функция ExtractFileNames используется для извлечения имени файла без расширения из указанного пути к файлу.
В процедуре SpeedButton1Click проверяется, существует ли указанный файл и его размер превышает максимальный размер куска.
Если файл достаточно велик, он делятся на куски размером MaxSize с помощью функций BlockRead и BlockWrite из библиотеки Delphi runtime library. Каждый кусок записывается в отдельный файл с инкрементированным индексом в имени файла (например, "file-1.xxx", "file-2.xxx" и т.д.).
Если файл не достаточно велик, отображается сообщение, указывающее, что разделения не необходимо.
Для сборки файлов вновь можно использовать DOS команду copy, как показано в комментарии в конце кода:
copy /b file-1.xxx+file-2.xxx+file-3.xxx file.mp3
Это будет сконкатенировать все файлы-куски в единый файл с именем "file.mp3".
Вот некоторые предложения по улучшению:
Вместо использования GetMem и FreeMem, рассмотрите использование TMemoryStream для управления буфером, так как она обеспечивает более функциональность и безопасность.
Вы можете использовать блоки Try-Except для обработки потенциальных ошибок при чтении или записи файлов.
Рассмотрите реализацию более robust системы именования для файлов-кусков, например, добавление временного штампа или GUID для обеспечения уникальности.
Если планируете часто делять большие файлы, рассмотрите использование базы данных или хранилища, предназначенного для обработки больших объемов данных.
В целом, код предоставляет основную реализацию разделения и сборки файлов. Однако он может выиграть от дополнительной обработки ошибок, robustness и оптимизации производительности.
Данный статья описывает алгоритм разделения файла на куски и склеивания их обратно в один файл, с помощью языка программирования Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.