Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

высвобождение файла [D5, D6, D7, Win95/98, Win2k, WinXP]


lexus3d_(1) ©   (2005-05-05 08:47:00) 

Вопрос возник неожиданно и незванно, но тем не менее прошу подсказать как можно решить данную проблемму:
- создаю файл (неважно какой просто создаю);затем пытаюсь этот файл зажать при помощи компонента, но перед этим стоит условие на проверку существования файла (файл существует! проверка проходит на ура!) но архив не создаёться поскольку файл то оказываеться занятым моим собственным приложением, так вот как мне освободить файл, что бы вновь на него сослаться!


lexus3d   (2005-05-05 12:30:00) [1]

2alpet

большущее спасибо ... сам виноват как раз там и были ошибки, убрал из цикла и всё нормально заработало.

спасибо что ткнул носом ... буду внимательнее!


alpet   (2005-05-05 10:29:00) [2]

Вынес из цикла AssignFile - все заработало, хотя не смотрел как это  повлияло на процесс упаковки.


alpet   (2005-05-05 10:27:00) [3]

2 ошибки пока нашел.
1. У меня не вызов  AssignFile(lFile, pName) приводил к исключению, заменил на  AssignFile(lFile, '.\' + pName);
2. Эта самая функция открывает файл несколько раз поскольку находится в теле цикла вместе Reset / ReWrite, тогда как CloseFile вне цикла. Это и дает ошибку доступа к файлу.


lexus3d   (2005-05-05 10:21:00) [4]


> alpet ©   (05.05.05 10:15) [6]
> хотя нет сейчас сам проверю.

вот вот ..проверька ... всё правельно она возвращает!


alpet   (2005-05-05 10:15:00) [5]

хотя нет сейчас сам проверю.


alpet   (2005-05-05 10:14:00) [6]

Догадайся что дает строка:

pZip:=ExtractFilePath(ParamStr(0))+'1.plp';

правильный ответ - " program.exe1.plp", где program - имя исполняемого файла твоей проги. Учись использовать отладчик и окно watch - помогает.


lexus3d   (2005-05-05 09:57:00) [7]

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 работает на "ура" проверенно... просто файл к которому я обращаюсь для архивации являеться занятым.


dmitry501   (2005-05-05 09:41:00) [8]

lexus3d_(1)   (05.05.05 8:47)
Приведите кусочки из программы где файл создается, закрывается и сжимается...


lexus3d   (2005-05-05 09:00:00) [9]

конечно .. файл создал поработал с ним и закрыл. я это отдельно в функции вынесь .. мне так нужно ... файл создаёться! я даже прочитать из него могу! А вот удалить не могу, поскольку он занят моим приложение.


KilkennyCat   (2005-05-05 08:54:00) [10]

как проверяется? после создания есть где-нить closefile() ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо