Thread View: pl.comp.lang.vbasic
12 messages
12 total messages
Started by Paweł
Thu, 03 Feb 2011 10:57
VB6 zmiana nazwy pliku
Author: Paweł
Date: Thu, 03 Feb 2011 10:57
Date: Thu, 03 Feb 2011 10:57
13 lines
1523 bytes
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
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 11:13
Date: Thu, 03 Feb 2011 11:13
11 lines
1259 bytes
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
Author: Paweł
Date: Thu, 03 Feb 2011 11:27
Date: Thu, 03 Feb 2011 11:27
13 lines
1364 bytes
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
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 12:58
Date: Thu, 03 Feb 2011 12:58
19 lines
1769 bytes
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
Author: Paweł
Date: Thu, 03 Feb 2011 14:01
Date: Thu, 03 Feb 2011 14:01
12 lines
1542 bytes
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
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 15:00
Date: Thu, 03 Feb 2011 15:00
28 lines
1957 bytes
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
Author: Paweł
Date: Thu, 03 Feb 2011 19:56
Date: Thu, 03 Feb 2011 19:56
25 lines
1821 bytes
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
Author: InDesign Scripts
Date: Thu, 03 Feb 2011 21:17
Date: Thu, 03 Feb 2011 21:17
28 lines
2586 bytes
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
Author: Paweł
Date: Thu, 03 Feb 2011 21:50
Date: Thu, 03 Feb 2011 21:50
19 lines
1864 bytes
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
Author: Emeryt
Date: Fri, 04 Feb 2011 07:05
Date: Fri, 04 Feb 2011 07:05
29 lines
2473 bytes
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
Author: Marcin Miga
Date: Tue, 08 Feb 2011 10:11
Date: Tue, 08 Feb 2011 10:11
10 lines
1618 bytes
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
Author: Slawek Kotynski
Date: Tue, 15 Feb 2011 15:23
Date: Tue, 15 Feb 2011 15:23
31 lines
2052 bytes
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