🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.vbasic
12 messages
12 total messages Started by Paweł Thu, 03 Feb 2011 10:57
VB6 zmiana nazwy pliku
#104764
Author: Paweł
Date: Thu, 03 Feb 2011 10:57
13 lines
1523 bytes
Witam !

Napisałem program, który zapisuje okresowo (np. co 1 sek.) obrazek na 
lokalny dysk. Ten obrazek w zależności od potrzeb jest pobierany przez 
serwer HTTP (Apache) i wysyłany do klienta.
W przypadku Linuxa tego typu operację zapisu wykonywałem na raty. Czyli 
zapisywałem obrazek pod tymczasową nazwą następnie zmieniałem nazwę na 
docelową. Zapobiegało to wysyłaniu przez serwer uszkodzonych obrazków.
Niestety w VB nie można wykonać zmiany nazwy jeśli plik o tej nazwie już 
istnieje. W jaki sposób się zabezpieczyć przed odczytaniem 
niekompletnego pliku przez inny program.

Paweł
Re: VB6 zmiana nazwy pliku
#104765
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 11:13
11 lines
1259 bytes
> Niestety w VB nie można wykonać zmiany nazwy jeśli plik o tej nazwie już 
> istnieje. W jaki sposób się zabezpieczyć przed odczytaniem 
> niekompletnego pliku przez inny program.

Google zdechły ? ;)

Do kasowania plików w VB6 służy komenda KILL.

http://www.vbforums.com/showthread.php?t=349991

robin
Re: VB6 zmiana nazwy pliku
#104766
Author: Paweł
Date: Thu, 03 Feb 2011 11:27
13 lines
1364 bytes
> Google zdechły ? ;)
>
> Do kasowania plików w VB6 służy komenda KILL.
>
> http://www.vbforums.com/showthread.php?t=349991

To nic nie da.
Skasowanie w jednej instrukcji i zmiana nazwy w drugiej spowoduje, że 
przez pewien czas plik nie będzie istniał. Jeśli serwer będzie akurat 
chciał go pobrać to spowoduje to błąd.

Paweł
Re: VB6 zmiana nazwy pliku
#104767
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 12:58
19 lines
1769 bytes
>> Do kasowania plików w VB6 służy komenda KILL.
>>
>> http://www.vbforums.com/showthread.php?t=349991
> 
> To nic nie da.
> Skasowanie w jednej instrukcji i zmiana nazwy w drugiej spowoduje, że 
> przez pewien czas plik nie będzie istniał. Jeśli serwer będzie akurat 
> chciał go pobrać to spowoduje to błąd.

Jaki to jest czas ? pół sekundy ?
Poza tym - jaki masz interwał w tym Apache, który pobiera pliki?
Nie możesz ustawić pobierania co np. 5 sekund - ale ZAWSZE w 0, 5, 10, 15, 20, ..., 45, 50, 55 sekundzie ?
A zapisywać z VB6 o sekunde później?
Czyli 0+1, 5+1, 10+1, ...
Wtedy masz 4 sekundy na zapis.

Poza tym - chyba w Apache jest możliwość wychwycenia błędu i próba ponowienia bez wywalenia się całości ?

robin
Re: VB6 zmiana nazwy pliku
#104769
Author: Paweł
Date: Thu, 03 Feb 2011 14:01
12 lines
1542 bytes
> Jaki to jest czas ? pół sekundy ?
> Poza tym - jaki masz interwał w tym Apache, który pobiera pliki?
> Nie możesz ustawić pobierania co np. 5 sekund - ale ZAWSZE w 0, 5, 10,
> 15, 20, ..., 45, 50, 55 sekundzie ?

Program w VB zapisuje 1-2 obrazki na sekundę.
Zapytania o obrazek do serwera mogą czasami przychodzić bardzo często 
np. 20 razy na sekundę. Serwer za każdym razem powinien odesłać obrazek. 
Jeśli go nie ma to odsyła błąd. Co jest pewnym problemem.

Paweł
Re: VB6 zmiana nazwy pliku
#104768
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 15:00
28 lines
1957 bytes
>> Jaki to jest czas ? pół sekundy ?
>> Poza tym - jaki masz interwał w tym Apache, który pobiera pliki?
>> Nie możesz ustawić pobierania co np. 5 sekund - ale ZAWSZE w 0, 5, 10,
>> 15, 20, ..., 45, 50, 55 sekundzie ?
> 
> Program w VB zapisuje 1-2 obrazki na sekundę.
> Zapytania o obrazek do serwera mogą czasami przychodzić bardzo często 
> np. 20 razy na sekundę. Serwer za każdym razem powinien odesłać obrazek. 
> Jeśli go nie ma to odsyła błąd. Co jest pewnym problemem.

No to może polecenie SHELL:
http://www.dbforums.com/visual-basic/1002770-copy-files-using-vbulletin.html

albo:

fso.CopyFile

Public Shared Sub CopyFile ( _
    sourceFileName As String, _
    destinationFileName As String, _
    overwrite As Boolean _
)

http://msdn.microsoft.com/en-us/library/e1wf9e7w%28VS.85%29.aspx

naprawdę nie potrafisz używać google?

robin
Re: VB6 zmiana nazwy pliku
#104770
Author: Paweł
Date: Thu, 03 Feb 2011 19:56
25 lines
1821 bytes
> No to może polecenie SHELL:
> http://www.dbforums.com/visual-basic/1002770-copy-files-using-vbulletin.html
>
>
> albo:
>
> fso.CopyFile
>
> Public Shared Sub CopyFile ( _
> sourceFileName As String, _
> destinationFileName As String, _
> overwrite As Boolean _
> )
>
> http://msdn.microsoft.com/en-us/library/e1wf9e7w%28VS.85%29.aspx

Zmiana nazwy polega jedynie na modyfikacji odpowiedniego pola w FAT. 
Można uznać, że następuje natychmiast. Kopiowanie pliku polega na 
odczytywaniu danych z jednych sektorów i zapisywanie ich do innych. Jest 
operacją trwającą bardzo długo.
Obecnie program w VB zapisuje jedynie plik. Co jest zapewne szybsze niż 
jego skopiowanie.

Paweł
Re: VB6 zmiana nazwy pliku
#104771
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 21:17
28 lines
2586 bytes
> Zmiana nazwy polega jedynie na modyfikacji odpowiedniego pola w FAT. 
> Można uznać, że następuje natychmiast. Kopiowanie pliku polega na 
> odczytywaniu danych z jednych sektorów i zapisywanie ich do innych. Jest 
> operacją trwającą bardzo długo.

Jak duże masz te pliki ?

> Obecnie program w VB zapisuje jedynie plik. Co jest zapewne szybsze niż 
> jego skopiowanie.

No to może użyj małego triku? Najpierw skopiuj plik źródłowy na jakiś tymczasowy - wtedy będzie on przez chwile w cache systemu/dysku a za moment skopiuj go jeszcze raz nadpisując ten właściwy ?

Bo inaczej - to masz przesrane, jeżeli normalne kopiowanie Ci nic nie daje i nie możesz zrobić obsługi błędów w PHP co jest na pewno wykonalne ...

tutaj masz przykład kulturalnej obsługi błędów:
http://www.w3schools.com/php/php_error.asp

czyli np:
1) kasujesz plik na dysku z poziomu VB i zapisujesz nowy pod tymczasową nazwą,

2) jak PHP będzie chiało odczytać plik - a go nie będzie - to niech poczeka np. 2sekundy
http://php.net/manual/en/function.sleep.php

3) w tym czasie kopiujesz i zmieniasz nazwe pliku na właściwą

Poza tym, może powinieneś przemyśleć cały workflow jeszcze raz ? Bo skoro zapis pliku z VB zajmuje tak długo czasu - to po co PHP próbuje tak często odczytywać ten sam plik - zamiast sprawdzić czy on już może nie istnieje w miejscu docelowym czy jak to tam u Ciebie działa ?

robin
Re: VB6 zmiana nazwy pliku
#104773
Author: Paweł
Date: Thu, 03 Feb 2011 21:50
19 lines
1864 bytes
> Jak duże masz te pliki ?

Zwykle około 25-40kB, maksymalnie 100kB
To są kolejne klatki obrazu on-line z kamery


> 2) jak PHP będzie chiało odczytać plik - a go nie będzie - to niech
> poczeka np. 2sekundy
> http://php.net/manual/en/function.sleep.php

Zapis pliku trwa długo w porównaniu do czasu zmiany nazwy. W 
rzeczywistości są to jakieś milisekundy. Operacje zapisu i odczytu 
odbywaja się bardzo często więc problemy są zauważalne.
Oczywiście w PHP można czekać. Statystycznie wcześniej czy później 
obrazek się plik się pojawi. Szukałem jednak ekwiwalentu rozwiązania ze 
zmianą nazwy, które się sprawdziło na Linuxie.

Paweł
Re: VB6 zmiana nazwy pliku
#104772
Author: Emeryt
Date: Fri, 04 Feb 2011 07:05
29 lines
2473 bytes
Użytkownik "Paweł" <pawel.neo@neostrada.pl> napisał w wiadomości 
news:iif8b5$hl7$1@mx1.internetia.pl...
>
>> Jak duże masz te pliki ?
>
> Zwykle około 25-40kB, maksymalnie 100kB
> To są kolejne klatki obrazu on-line z kamery
>
>
>> 2) jak PHP będzie chiało odczytać plik - a go nie będzie - to niech
>> poczeka np. 2sekundy
>> http://php.net/manual/en/function.sleep.php
>
> Zapis pliku trwa długo w porównaniu do czasu zmiany nazwy. W 
> rzeczywistości są to jakieś milisekundy. Operacje zapisu i odczytu 
> odbywaja się bardzo często więc problemy są zauważalne.

Jesteś nieprecyzyjny. W pierwszym newsie piszesz że zapis jest co 1 sek, w 
tym że bardzo często. Jeżeli program obsługi kamery zapisuje obraz na dysk 
to automatycznie każda klatka zapisywana jako oddzielny plik ma inną nazwę 
(nazwe nadaje program kamery). Program kamery zapisuje również na dysk film 
gdy występuje ruch. W trakcie zapisu pliku na dysk nie jest możliwy jego 
odczyt. Po zapisaniu instrukcją Name możesz zmienić nazwe pliku, pod 
warunkiem ze w tym momencie nie jest on otwarty do odczytu lub zapisu. 
Jezeli jest to w pentli czekasz do czasu gdy zostanie zamkniety (obsługa 
błędu).

pozdr
Re: VB6 zmiana nazwy pliku
#104775
Author: Marcin Miga
Date: Tue, 08 Feb 2011 10:11
10 lines
1618 bytes
> Niestety w VB nie można wykonać zmiany nazwy jeśli plik o tej nazwie już
> istnieje. W jaki sposób się zabezpieczyć przed odczytaniem
> niekompletnego pliku przez inny program.

Można. Specjalnie sprawdziłem. FileCopy działa nawet w VBA! I
zachowuje się prawidłowo. Czyli nadpisuje plik. A jeśli nie, to ...
jest to opisane w helpie. Znaczy, że któryś z tych plików jest
otwarty, ale to wtedy nawet system sobie z tym nie poradzi...

pozdrawiaMM
Re: VB6 zmiana nazwy pliku
#104774
Author: Slawek Kotynski
Date: Tue, 15 Feb 2011 15:23
31 lines
2052 bytes
Paweł wrote:

>> Google zdechły ? ;)
>>
>> Do kasowania plików w VB6 służy komenda KILL.
>>
>> http://www.vbforums.com/showthread.php?t=349991
> 
> To nic nie da.
> Skasowanie w jednej instrukcji i zmiana nazwy w drugiej spowoduje, że 
> przez pewien czas plik nie będzie istniał. Jeśli serwer będzie akurat 
> chciał go pobrać to spowoduje to błąd.

W dowolnym systemie operacyjnym masz identyczny problem.
Najszybsze rename na istniejacy plik zawsze się robi w sekwencji
delete i rename (no bo copy było by na ogół wolniejsze,
i zwykle lepiej nie pobrać pliku, niż pobrać z ukrytymi błędami).

Gdy plik nie istnieje, program pobierający powinien
czekać (milisekundy?) i ponawiać próby - lepiej nie w nieskończoność :)

Ewentualnie możesz na czas kopiowania zakładać "lock file".
Na przyład przed  rename założyć plik 
blokowanie-dostepu-do-kopiowania-nazwa-bokowanego-pliku.tmp",
po rename go usuwać. Program pobierający może czekać
jeśli lock file istnieje.

-- 
mjk
Nie pisz na smieciarz@askar.com.pl - to pułapka
s/smieciarz/kotynski/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads