![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Файл
Res © (2008-01-24 13:29:00)Здравствуйте! Пытаюсь открыть файл (размер файла больше 150 мб, кодировка Unicode), но выскавивает ошибка: "Cannot open file ''. The file name or extrension too long". Задача: открыть файл, изменить данный и сохранить. Подскажите как это можно сделать.
Мой код:
function LoadUnicodeFile(const filename: string):string;
procedure SwapWideChars(p: PWideChar);
begin
while p^ #0000 do
begin
p^ := WideChar(Swap(Word(p^)));
Inc(p);
end;
end;
var
ms: TMemoryStream;
wc: WideChar;
pWc: PWideChar;
begin
ms := TMemoryStream.Create;
try
ms.LoadFromFile(filename);
ms.Seek(0, soFromend);
wc := #0000;
ms.Write(wc, sizeof(wc));
pWC := ms.Memory;
if pWc^ = #$FEFF then {normal byte order mark}
Inc(pWc)
else if pWc^ = #$FFFE then
begin {byte order is big-endian}
SwapWideChars(pWc);
Inc(pWc);
end
else
; {no byte order mark}
LoadUnicodeFile := WideChartoString(pWc);
finally
ms.free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ai: Tstrings;
begin
ai:=Tstringlist.Create;
if(fileexists(form1.Edit1.Text)) then
begin
ai.LoadFromFile(LoadUnicodeFile(form1.Edit1.Text));
ai.SaveToFile('c:\ai.rar');
end
else
begin
application.MessageBox('Ôàéë íå íàéäåí!', 'Îøèáêà', mb_ok);
end;
end;
Res (2008-01-24 16:06:00) [1]
> StringToWideChar - VCL
> MultiByteToWideChar - API
GetMem(OleStr, (Length(ai.Text)+1) - SizeOf(WideChar));
try
ai.Text:=StringToWideChar(ai.Text,OleStr, Length(ai.Text)+1);
finally
FreeMem(OleStr);
Ошибка вылетает,типа нехватка памяти
ANB (2008-01-24 15:59:00) [2]
> Задача: открыть файл, изменить данный и сохранить. Подскажите
> как это можно сделать.
А вот преобразование АНСИ - ЮниКод и обратно в ТЗ отсутствует.
И лучше от него избавится, т.к. даже если исходный файл не меняли, результат может отличаться от исходного.
clickmaker (2008-01-24 15:52:00) [3]StringToWideChar - VCL
MultiByteToWideChar - API
Res (2008-01-24 15:34:00) [4]Пожалуйста подскажите функцию обратную UnicodeFile, т.е. из Ansi перевести в Юникод и сохранить в файл
Res (2008-01-24 13:46:00) [5]Да эт я так написал ))) чтобы ai не заменился :)))
Washington (2008-01-24 13:44:00) [6]
> легким движением руки уникодный файл превращается в архив
> РАР )
Извините за технические неполадки )
clickmaker (2008-01-24 13:41:00) [7]
> ai.SaveToFile('c:\ai.rar');
легким движением руки уникодный файл превращается в архив РАР )
Res (2008-01-24 13:40:00) [8]Спасибо, понял, надо использовать
ai.text вместо ai.loadfromfile
Palladin (2008-01-24 13:38:00) [9]такое только в бреду написать можно
{RASkov} (2008-01-24 13:37:00) [10]> [2] Res (24.01.08 13:36)
А теперь почитай что делает метод LoadFromFile
Res (2008-01-24 13:36:00) [11]Да, функция LoadUnicodeFile файл возращает файл, в типе string;
так вот этот string мне надо открыть, изменить, и сохранить
clickmaker (2008-01-24 13:32:00) [12]
> ai.LoadFromFile(LoadUnicodeFile(form1.Edit1.Text));
LoadFrom File, а ты подсовываешь содержимоефайла