Błąd zapisu plików z pliku zasobów.

0

Słuchajcie mam taki problem, że ładuję do pliku *.res różne pliki i później program ma je zapisywać na dysk w odpowiednie miejsce. Używam takiego kodu:

var
  Res: TResourceStream;
begin
  ...
  Res := TResourceStream.Create(hInstance, 'file_1', RT_RCDATA);
  Res.SaveToFile(Dir + 'file1.dat');
  Res.Free;
  Res := TResourceStream.Create(hInstance, 'file_2', RT_RCDATA);
  Res.SaveToFile(Dir + 'file2.dat');
  Res.Free;
  ...

I tak kilkanaście plików. Akurat na moim komputerze nie miałem takiego przypadku, ale niektórzy mi mówili, że przy próbie ponownego uruchomienia programu i wypakowaniu wyskakuje error. Nie wiecie czym to może być spowodowane? Dodatkowo przy kolejnej próbie wypakowania pliku w inne miejsce problem czasami nie występuje już, ale tylko czasami. Nie wiem dokładnie jaki błąd, ponieważ mam ujęty cały ten kod w try - except. Musiałbym to przerobić normalnie i potem ktoś by musiał zrobić screen błędu. Ale ogólnie co o tym sądzicie? Dodatkowo program wymusza tryb admina na Viscie i 7-ce.

0

Tryb admina pewnie po to, bo program nie ma uprawnień do wklejania plików gdzieś na dysku.
A może zamiast jednej zmiennej wczytuj zasoby strumienie do tablicy, a potem zapisuj? Kod byłby czytelniejszy, a co ważniejsze takiej samej długości, zawsze... nawet gdybyś miał 1000 plików do wklejenia.

0

W sensie do tablicy typu TResourceStream? Spróbuję. :)

0

Tak, a przy próbie ponownego uruchomienia i wypakowania może być błąd przez to że program próbuje utworzyć plik który jest już utworzony (2 razy wkleja ten file1.dat).

0

No niestety nie ma możliwości. Jest sprawdzanie wcześniej czy te pliki istnieją. Ale na razie spróbuje tamtego ;).

3
delphi_maker napisał(a)

przy próbie ponownego uruchomienia programu i wypakowaniu wyskakuje error

Jeśli wyskakuje error, to musisz uruchamiać program dotąd, aż przestanie wyskakiwać.

0

Źle mnie zrozumiałeś. Program się uruchamia, a to "wypakowywanie" uruchamia się przyciskiem i wtedy im wywala błąd.

0

Zgaduj zgadula.... powodem takiego zachowania może być np. to, że wypakowane po raz pierwszy pliki są używane przez jakiś inny program (lub przez siebie same, jeśli "różne pliki" oznacza np. programy), co nie pozwala na ich nadpisanie.

0

Co rozumiesz pod pojęciem, że pliki mogą używać same siebie? To są zwykłe pliki typu *.dat, żadne pliki wykonywalne.

0

"jeśli "różne pliki" oznacza np. programy", a skoro to nie programy, to same siebie w takim razie nie użyją :)

Więc zostaje szukać co je używa...

0

Niestety przerobienie na tablice nic nie dało. Zrobiłem obsługę wyjątku i dostaje komunikat:

"Cannot create file '...tutaj ścieżka...'. Odmowa dostępu 0"

W momencie wystąpienia błędu plik podany w ścieżce nie istnieje, folder nie ma uprawnień tylko do odczytu, a program uruchamiany jest w trybie administratora...

Macie jakieś pomysły jeszcze?

0

Spróbuj przerobić według tego przykładu:

var
  Fres: TResourceStream;
  Ffile: TFileStream;
begin
  Fres := TResourceStream.Create(0,'nazwa_folderu_w_zasobie',RT_RCDATA);
  Ffile := TFileStream.Create('program.exe',fmCreate);
  Ffile.CopyFrom(Fres,Fres.Size);
  Fres.Free;
  Ffile.Free;
end;
0

Niestety problem występuje dalej...

1 użytkowników online, w tym zalogowanych: 0, gości: 1