Ĺadny brzuch
Witam mam program do wysylania pliku. Problem jestw tym ze za 1 razem wszystko gra ladnie sie wysyla ale za to za 2 razem juz nie/ W delphi wyswietla sie oto taki komunikat
Project Project1.exe raised exception class EInOutError with message 'File access denied'. Process stopped. Use Step or Run to continue.
Program podswietla mi linijke Reset(f2,1);
Oto kod serwerka
var Pr2: string; f2,pl:file; od,po:integer; pa: Array[0..1024] of Char; If copy(Pr2,0,3) = 'c22' then begin l5.Caption:=(copy(Pr2,4,length(Pr2)-1)); assignfile(f2,l5.caption); Reset(f2,1); l4.Caption:=Format('%10.0f',[FileSize(f2)/1]); closefile(f2); s6.Socket.Connections[0].SendText('filesize'+l4.Caption); if fileexists(l5.caption) then begin s6.Socket.Connections[0].SendText('wysylam'+extractfilename(l5.caption)) ; po:=0; AssignFile(pl,l5.caption); Reset(pl,1); repeat Application.ProcessMessages; Sleep(10); Seek(pl,po); BlockRead(pl,pa,sizeof(pa),od); if od>0 then begin s7.Socket.Connections[0].SendBuf(pa,SizeOf(pa)); po:=po+od; end; until od=0; s6.Socket.Connections[0].SendText('koniec'); CloseFile(pl); end; end;
Prosze o pomoc. Z gory thx :)
Prawdopodobnie plik jest juz otwarty. Moze ktorys blednie zamykasz albo cos... Przestudiuj koncowke kodu...
tez tak mysle ale nie wiem jak go naprawic:/
Reset(f2,1);
Ta ostatnia jedynka powoduje otwarcie pliku w trybie "Tylko do zapisu". "ABC Delphi 6 by Helion" :)
no i co z tego? przeciez on czyta nie pisze...
Użytkownik migajek edytował ten post 25 sierpień 2005, 18:47
Napisalem
Reset(pl); (bez 1) i
i oto mam taki blad
Project Project1.exe raised exception class EInOutError with message 'I/O error 998''. Process stopped. Use Step or Run to continue.
a strzalka tym razem zatrzymuje sie na
BlockRead(pl,pa,sizeof(pa),od);
I to przy 1 probie sciagania a nie jak poprzednio sypal sie przy 2 lub 3
Spróbuj przed Reset(pl, 1) ustawić FileMode := 0;
Spróbuj przed Reset(pl, 1) ustawić FileMode := 0;
Nie kompilowałem tego, ale...
1. Błąd:if od>0 then begin s7.Socket.Connections[0].SendBuf(pa,SizeOf(pa));powinno być:s7.Socket.Connections[0].SendBuf(pa,od);
2. Błąd:Seek(pl,po);usuń to; po co przesuwać wskaźnik pozycji w pliku, skoro robi to za Ciebie funkcja BlockRead() ?
1. Przed resetami dawaj FileMode := fmOpenRead;
Jezeli to nie dziala to moze OpenRead... A jak nie to zobacz do pomocy delphi bo nie mam teraz odpalonego...
2. Radze uzyc innych komponentów niz stanadardowy ClientSocket bo nie ma tam mozliwosci sprawdzenia czy mozemy wyslac dane (przynajmniej nie znalazlem), co prowadzi do tego ze program sie sypie przy za szybkim wysylaniu danych (jest to prawie nieodczuwalne na Localhost, ale w sieci juz jest...).
//
3. Moja rada: wysylaj pakiety z 'naglowkiem', bo dane sie dziela i moze byc problem z odbieraniem tekstu... Budowa przykladowego pakietu danych polecenie: byte; (mozna word jak sie planuje rozbudowanego progsa....) datasize: word; i teraz dane pakietu o dlugosci datasize
Taki pakiet jest latwo odebrac - odbieramy najpierw polecenie (mozesz nie uzywac polecenia, ale ulatwia ono rozbudowywanie programu....), a nastepnie dlugosc danych i teraz czytamy dane az odbierzeby ilosc "dlugoscdanych" :) Jezeli chcialbys komponenty z wbudowana obsluga takiego "protokołu" to daj znac... ;)
//
4. Sleep(10); Po co to? :blink:
Użytkownik Ali240 edytował ten post 28 sierpień 2005, 21:24
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Project Project1.exe raised exception class EInOutError with message 'File access denied'. Process stopped. Use Step or Run to continue.
Program podswietla mi linijke Reset(f2,1);
Oto kod serwerka
var Pr2: string; f2,pl:file; od,po:integer; pa: Array[0..1024] of Char; If copy(Pr2,0,3) = 'c22' then begin l5.Caption:=(copy(Pr2,4,length(Pr2)-1)); assignfile(f2,l5.caption); Reset(f2,1); l4.Caption:=Format('%10.0f',[FileSize(f2)/1]); closefile(f2); s6.Socket.Connections[0].SendText('filesize'+l4.Caption); if fileexists(l5.caption) then begin s6.Socket.Connections[0].SendText('wysylam'+extractfilename(l5.caption)) ; po:=0; AssignFile(pl,l5.caption); Reset(pl,1); repeat Application.ProcessMessages; Sleep(10); Seek(pl,po); BlockRead(pl,pa,sizeof(pa),od); if od>0 then begin s7.Socket.Connections[0].SendBuf(pa,SizeOf(pa)); po:=po+od; end; until od=0; s6.Socket.Connections[0].SendText('koniec'); CloseFile(pl); end; end;
Prosze o pomoc. Z gory thx :)
Prawdopodobnie plik jest juz otwarty. Moze ktorys blednie zamykasz albo cos... Przestudiuj koncowke kodu...
tez tak mysle ale nie wiem jak go naprawic:/
Reset(f2,1);
Ta ostatnia jedynka powoduje otwarcie pliku w trybie "Tylko do zapisu". "ABC Delphi 6 by Helion" :)
no i co z tego? przeciez on czyta nie pisze...
Użytkownik migajek edytował ten post 25 sierpień 2005, 18:47
Napisalem
Reset(pl); (bez 1) i
i oto mam taki blad
Project Project1.exe raised exception class EInOutError with message 'I/O error 998''. Process stopped. Use Step or Run to continue.
a strzalka tym razem zatrzymuje sie na
BlockRead(pl,pa,sizeof(pa),od);
I to przy 1 probie sciagania a nie jak poprzednio sypal sie przy 2 lub 3
Spróbuj przed Reset(pl, 1) ustawić FileMode := 0;
Spróbuj przed Reset(pl, 1) ustawić FileMode := 0;

Nie kompilowałem tego, ale...
1. Błąd:if od>0 then begin s7.Socket.Connections[0].SendBuf(pa,SizeOf(pa));powinno być:s7.Socket.Connections[0].SendBuf(pa,od);
2. Błąd:Seek(pl,po);usuń to; po co przesuwać wskaźnik pozycji w pliku, skoro robi to za Ciebie funkcja BlockRead() ?
1. Przed resetami dawaj FileMode := fmOpenRead;
Jezeli to nie dziala to moze OpenRead... A jak nie to zobacz do pomocy delphi bo nie mam teraz odpalonego...
2. Radze uzyc innych komponentów niz stanadardowy ClientSocket bo nie ma tam mozliwosci sprawdzenia czy mozemy wyslac dane (przynajmniej nie znalazlem), co prowadzi do tego ze program sie sypie przy za szybkim wysylaniu danych (jest to prawie nieodczuwalne na Localhost, ale w sieci juz jest...).
//
3. Moja rada: wysylaj pakiety z 'naglowkiem', bo dane sie dziela i moze byc problem z odbieraniem tekstu... Budowa przykladowego pakietu danych polecenie: byte; (mozna word jak sie planuje rozbudowanego progsa....) datasize: word; i teraz dane pakietu o dlugosci datasize
Taki pakiet jest latwo odebrac - odbieramy najpierw polecenie (mozesz nie uzywac polecenia, ale ulatwia ono rozbudowywanie programu....), a nastepnie dlugosc danych i teraz czytamy dane az odbierzeby ilosc "dlugoscdanych" :) Jezeli chcialbys komponenty z wbudowana obsluga takiego "protokołu" to daj znac... ;)
//
4. Sleep(10); Po co to? :blink:
Użytkownik Ali240 edytował ten post 28 sierpień 2005, 21:24