Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Внизвысвобождение файла Найти похожие ветки
← →
lexus3d_(1) (2005-05-05 08:47) [0]Вопрос возник неожиданно и незванно, но тем не менее прошу подсказать как можно решить данную проблемму:
- создаю файл (неважно какой просто создаю);затем пытаюсь этот файл зажать при помощи компонента, но перед этим стоит условие на проверку существования файла (файл существует! проверка проходит на ура!) но архив не создаёться поскольку файл то оказываеться занятым моим собственным приложением, так вот как мне освободить файл, что бы вновь на него сослаться!
← →
KilkennyCat © (2005-05-05 08:54) [1]как проверяется? после создания есть где-нить closefile() ?
← →
lexus3d © (2005-05-05 09:00) [2]конечно .. файл создал поработал с ним и закрыл. я это отдельно в функции вынесь .. мне так нужно ... файл создаёться! я даже прочитать из него могу! А вот удалить не могу, поскольку он занят моим приложение.
← →
dmitry501 © (2005-05-05 09:41) [3]lexus3d_(1) (05.05.05 8:47)
Приведите кусочки из программы где файл создается, закрывается и сжимается...
← →
lexus3d © (2005-05-05 09:57) [4]
procedure PakToFile(pName: PChar);
//pFile - путь до файлов которые будут сливаться!
//fName - имя файла который будет заливаться в общий файл
//pName - путь/имя файла который должен получиться после сливания
var tFiles,lFile: File;
fSize,i,j,xSize: integer;
cCh:array [0..1023] of Byte;//Char;
NumRead, NumWritten: Integer;
fName,sName: String;
begin
if FileExists(pName) then DeleteFile(pName);
for i:=0 to List.Count-1 do
begin
fName:=List.Strings[i];
AssignFile(lFile,pName);
if not FileExists(pName) then
ReWrite(lFile,1)
else
Reset(lFile,1);
AssignFile(tFiles,pFile+fName);
Reset(tFiles,1);
fSize:=Filesize(lFile);
if fSize<>0 then Seek(lFile,fSize);
//------------------------------------------------------------------------------>
sName:=inttostr(Length(fName)); //опред.длину названия фыйла
xSize:=byte(Length(sName)); //из скольки символов состоит число "длинны" файла
sName:=numSize(xSize,sName); //получаем конечный результат: "001" или "021" или "215"
for j:=1 to 3 do //записываем размер имени файлы
BlockWrite(lFile,sName[j],SizeOf(sName[j]),NumWritten);
for j:=1 to length(fName)do //записываем имя файла
BlockWrite(lFile,fName[j],1,NumWritten);
//------------------------------------------------------------------------------>
fSize:=Filesize(tFiles); //определяем размер файла пере-
sName:=inttostr(Length(IntToStr(fSize))); //водим его в символьное выра-
xSize:=byte(Length(sName)); //жение для записи в конечный
sName:=numSize(xSize,sName); //файл.
for j:=1 to 3 do
BlockWrite(lFile,sName[j],SizeOf(sName[j]),NumWritten);
sName:=inttostr(fSize);
xSize:=Length(sName);
for j:=1 to xSize do
BlockWrite(lFile,sName[j],SizeOf(sName[j]),NumWritten);
//------------------------------------------------------------------------------>
repeat
BlockRead(tFiles,cCh,SizeOf(cCh),NumRead); //сам процесс соединения фалов в один
BlockWrite(lFile,cCh,NumRead,NumWritten); //
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(tFiles);
end;
FileMOde:=0;
CloseFile(lFile);
end;
.....
//упаковка идёт через компонент
pZip:=ExtractFilePath(ParamStr(0))+"1.plp";
if FileExists (pZip) then
begin
Zip1.CreateArchive(Edit1.Text);
Zip1.AddFile(pZip);
Zip1.CloseArchive;
ShowMessage("Скин готов!");
end
else
ShowMessage("Файла для скина не существует!!!");
end;
ну вот вырезки из кода .. procedure"a работает на "ура" проверенно... просто файл к которому я обращаюсь для архивации являеться занятым.
← →
alpet © (2005-05-05 10:14) [5]Догадайся что дает строка:
pZip:=ExtractFilePath(ParamStr(0))+"1.plp";
правильный ответ - "program.exe1.plp", где program - имя исполняемого файла твоей проги. Учись использовать отладчик и окно watch - помогает.
← →
alpet © (2005-05-05 10:15) [6]хотя нет сейчас сам проверю.
← →
lexus3d © (2005-05-05 10:21) [7]
> alpet © (05.05.05 10:15) [6]
> хотя нет сейчас сам проверю.
вот вот ..проверька ... всё правельно она возвращает!
← →
alpet © (2005-05-05 10:27) [8]2 ошибки пока нашел.
1. У меня не вызов AssignFile(lFile, pName) приводил к исключению, заменил на AssignFile(lFile, ".\" + pName);
2. Эта самая функция открывает файл несколько раз поскольку находится в теле цикла вместе Reset / ReWrite, тогда как CloseFile вне цикла. Это и дает ошибку доступа к файлу.
← →
alpet © (2005-05-05 10:29) [9]Вынес из цикла AssignFile - все заработало, хотя не смотрел как это повлияло на процесс упаковки.
← →
lexus3d © (2005-05-05 12:30) [10]2alpet
большущее спасибо ... сам виноват как раз там и были ошибки, убрал из цикла и всё нормально заработало.
спасибо что ткнул носом ... буду внимательнее!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c