Zámek na souboru   zodpovězená otázka

VB.NET

Aplikace zpracovává soubory, které jsou zasílány přes FTP z jednotlivých stanic. Stává se mi však, že zpracovávaný soubor se nepovede aplikací smazat, jelikož je pravděpodobně ještě zamčen FTP serverem. Výsledkem je to, že se mi FTP adresář plní časem množstvím souborů, které není možné smazat ani ručně přes průzkumníka, pomůže jen restart windows.

Dočasně mám polovičaté řešení, kdy zpracovávám soubory, u kterých byl poslední zápis před X sekundami, ale také to není na 100%.

Dotaz tedy zní : existuje v NET nějaká možnost jak zjistit, že soubor na který chci přistupovat je otevřený jiným procesem ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Neexistuje, muselo by se použít Windows API. Pouze v případě, že chcete pracovat se souborem který má uzamčen jiný proces může nastat vyjímka kterou lze nějak ošetřit.

Na vašem místě bych se ujistil, zda-li je ten soubor uzamčen skutečně něčím jiným než vaší aplikací, speciálně pokud používáte k odesílání souborů pomocí FTP prostředky z .NET Frameworku.

Nedávno se tu totiž řešil podobný problém, kdy tazatel odesílal přílohu e-mailové zprávy pomocí SmtpClient a jedna z jeho tříd si soubor vnitřně udržovala otevřený takže nešel smazat dokud se u příslušné třídy nezavolalo Dispose, případně se použilo Using...End Using.

http://www.vbnet.cz/forum-tema--3059-the...

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Soubory zpracovává externí FTP server, nikoliv tedy moje aplikace (ta si je bere pouze ke zpracování z úložiště). Není problém odchytit vyjímku, ale děje se divná věc. Pokud došlo při mazání souboru k vyjímce (je držen jiným procesem) není možné jej již odstranit, pomůže jen restart windows. Děje se to na 3 pokusných strojích.

Můžete mne alespoň nasměrovat k příslušné API ? Stačí mi vědět, jestli je soubor držen jiným procesem. Nic víc (tedy jen true|false). Google protáčím už od rána a nějak z toho nejsem moudrý.

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Můžete zkusit periodicky kontrolovat stav souoru přes LockFileEx (http://msdn.microsoft.com/cs-cz/library/...,VS.85%29.aspx) a flagem LOCKFILE_FAIL_IMMEDIATELY.

Po lehkém podívání se do MSDN library si nemyslím, že by to šlo nějak elegantněji, např tak, že by se zavolal nějaký callback nebo skončilo blokující volání jakmile by soubor byl k dispozici, např fce WaitForSingleObject, používaná k čekání na mutexy, procesy, vlákna a dalsí objekty OS, neumí čekat na souborový handle.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky moc, tudy asi cestička povede. Po oživení sem dám zdrojáček.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback