![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с файлами
unknowing © (2006-02-02 08:20:00)Доброго времени суток! Вопрос такой: есть файл (текстовый) который содержит символы '-'. Необходимо все '-' заменить на какой-нибудь другой(например, на '!').
unknowing (2006-02-02 10:24:00) [1]Вопрос исчерпан. Направление движения ясно :)
Огромное спабибо откликнувшимся!!!
wal (2006-02-02 10:11:00) [2]
> А можно простыми терминами объяснить что есть отображение
> и когда его применять?
Отображение, это когда файл, расположенный на диске "проецируется" в адресное пространство твоего приложения (или нескольких приложений). При этом работая с памятью не нужно заботиться об операциях чтения-записи - этим занимается система. В конце концов она денег стоит, пусть отрабатывает.
Применять можно при твоей задаче, или схожей.
Так же можно применять для обмена данными между разними процессами, когда файл отображен в адресное пространство нескольких процессов. При этом можно новый файл не создавать, а использовать файл подкачки.
С уважением.
Fay (2006-02-02 10:08:00) [3]Можно. На сайте есть статья.
unknowing (2006-02-02 10:03:00) [4]
> Fay © (02.02.06 09:53) [27]
Здорово, спасибо! А можно простыми терминами объяснить что есть отображение и когда его применять?
Fay (2006-02-02 09:53:00) [5]2 unknowing © (02.02.06 09:39) [26]
> если честно, до файлов отображенных в память еще не дошел:)
var
hFile, hFileMapping : THandle;
pView : PAnsiChar;
n, dwFileSize : DWORD;
label
EOL;
begin
hFile := CreateFileA(PChar('x:\file name.ext'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hFile = INVALID_HANDLE_VALUE then
RaiseLastOSError;
try
dwFileSize := GetFileSize(hFile, nil);
if dwFileSize = 0 then
Exit;
hFileMapping := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, dwFileSize, nil);
pView := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
for n := 0 to dwFileSize - 1 do
if pView[n] = '-' then
pView[n] := '!';
UnmapViewOfFile(pView);
CloseHandle(hFileMapping);
FlushFileBuffers(hFile);
finally
CloseHandle(hFile);
end;
unknowing (2006-02-02 09:39:00) [6]
> Fay © (02.02.06 09:33) [24]
> Digitman © (02.02.06 09:29) [22]
Спасибо за отзыв! Но я, как бы новичок и, если честно, до файлов отображенных в память еще не дошел:)
> Это и есть большой файл?! LOL 8)
Имеется в виду, что строка содержащая такое кол-во символом тяжела для
replaceString(text,..). Или см.
> unknowing © (02.02.06 08:58) [11]
unknowing (2006-02-02 09:35:00) [7]
> Ega23 © (02.02.06 09:28) [20]
Большое спасибо! Действительно быстрее чем read,write!!
Fay (2006-02-02 09:33:00) [8]2 unknowing
> Файл очень большого размера.
> 1.5 мБ.
Это и есть большой файл?! LOL 8)
Смотри внимательно ответ [22]
КаПиБаРа (2006-02-02 09:30:00) [9]unknowing © (02.02.06 9:26) [19]
Нужно отлаживать программу.
Запусти программу из Delphi поставь точки останова или через каждые 100-1000 строк ShowMessage(С номером строки). Определи причину зависания.
Digitman (2006-02-02 09:29:00) [10]
> unknowing © (02.02.06 09:21) [16]
Используя OpenFile + CreateFileMapping + MapViewOfFile отображаешь свой файл в ВАП своего процесса, при этом ты получаешь нач.адрес месторазмещения образа файла. Зная этот адрес и полный размер файла работаешь с образом как с обычным массивом байт, в цикле находя эл-ты массива с искомым значением и заменяя на требуемые.
КиТаЯц (2006-02-02 09:28:00) [11]
> unknowing © (02.02.06 09:26) [19]
>
>
> > КаПиБаРа © (02.02.06 09:24) [17]
>
> Это значит, что после подобного вызова этойфункции у меня
> наглухо зависла сама программа, а потом и ОС.
1. Какой?
2. Код в студию щеликом пожалуйста. Спасибо.
Ega23 (2006-02-02 09:28:00) [12]
function ReplaceChar(const CharIn, CharOut : Char; const FileName:String):Boolean;
var
List:TStringList
i:Integer;
begin
Result:=True;
List:=TStringLis.Create;
try
try
List.LoadFromFile(FileName);
for i:=0 to List.Count-1 do
List.Strings[i]:= StringReplaceAll(List.Strings[i], CharIn, CharOut);
List.SaveToFile(FileName);
except
Result:=False;
end;
finally
List.Free;
end;
end;
unknowing (2006-02-02 09:26:00) [13]
> КаПиБаРа © (02.02.06 09:24) [17]
Это значит, что после подобного вызова этой функции у меня наглухо зависла сама программа, а потом и ОС.
КиТаЯц (2006-02-02 09:25:00) [14]
> unknowing © (02.02.06 09:17) [13]
Тэкс... Тут в "прочие" вчера тему поднимали про то, что "надо де вежливее с новичками"...
ЧТО НЕ РАБОТЕТ?!!!
КаПиБаРа (2006-02-02 09:24:00) [15]unknowing © (02.02.06 8:58) [11]
Не работает с большими файлами или...
"Не работает" это что значит?
unknowing (2006-02-02 09:21:00) [16]
> Ega23 © (02.02.06 09:19) [15]
1.5 мБ.
Ega23 (2006-02-02 09:19:00) [17]Насколько большой размер файла?
Fay (2006-02-02 09:18:00) [18]
const
BUFSIZE = 4096;
FILE_NAME = 'x:\file name.ext';
var
hFile : THandle;
n, nr, nw : DWORD;
Buffer : array[0..BUFSIZE - 1] of AnsiChar;
label
EOL;
begin
hFile := CreateFileA(FILE_NAME, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hFile = INVALID_HANDLE_VALUE then
RaiseLastOSError;
try
goto EOL;
repeat
for n := 0 to nr - 1 do
if Buffer[n] = '-' then
Buffer[n] := '!';
SetFilePointer(hFile, -nr, nil, FILE_CURRENT);
WriteFile(hFile, Buffer, nr, nw, nil);
EOL :
ReadFile(hFile, Buffer, BUFSIZE, nr, nil);
until nr = 0;
FlushFileBuffers(hFile);
finally
CloseHandle(hFile);
end;
unknowing (2006-02-02 09:17:00) [19]
> КиТаЯц © (02.02.06 09:07) [12]
У меня все один в один! Не работает!!! Я уже не знаю что и делать... На низком уровне Read, Write очень медленно...
КиТаЯц (2006-02-02 09:07:00) [20]Пытаемся развить идею [7] (сочиняю на ходу - возможны ошибки)
var InFile: textfile;
List: tStringlist;
S: string
i: integer;
begin
List:= tstringlist.Create;
try
assignfile (InFile, 'Text.txt');
reset (InFile);
while not EOF(InFile) do begin
readln (InFile, S);
S:= StringReplaceAll(S, '-','!');
List.Add(S);
end;
CloseFile(InFile);
List.SaveToFile('Text.txt');
except
CloseFile(InFile);
FreeAndNil(List);
end;
end;