Avatar billede Spotgun Seniormester
09. juni 2006 - 13:47 Der er 11 kommentarer og
1 løsning

Check om en anden process "holder" på fil der skal læses.

Jeg er ved at arbejde med et program der skal læse nogle indholdet af nogle filer i en mappe, som jævnligt får tilført nye filer.

Problemet er bare, at jeg ikke ved om disse filer er i brug af en anden process, som ikke nødvendigvis låser filerne for læsning.

Er det muligt at finde ud af, om en anden process har fat i den fil, som jeg gerne skal læse HELE indholdet af, og altså ikke kun det indhold som den anden process har fået skrevet indtil det tidspunkt hvor jeg læser filen...

Som det er lige nu, så kan jeg i visse tilfælde få læst f.eks. halvdelen af en fil, fordi den ikke er skrevet færdig af et andet eksternt program.

What to do?
Avatar billede spif2001 Nybegynder
09. juni 2006 - 13:55 #1
File.GetLastWriteTime(string path);

den vil fortælle dig hvornår der sidst blev skrevet i filen. Måske kan du sætte en tidsparameter op, til hvor gammel en fil skal være før du læser den?
Avatar billede Spotgun Seniormester
09. juni 2006 - 15:10 #2
Så vidt jeg har testet, så bliver GetLastWriteTime kun opdateret når man starter eller slutter med at skrive til en fil. Så hvis vi tager en situation hvor et program f.eks. skriver en meget stor fil i ét hug, så vil GetLastWriteTime blive ved med at vise start-tidspunktet, og altså ikke blive opdateret løbende mens filen skrives...

Det er da en mulighed at vente "længe nok", eller løbende checke på om filstørrelsen bliver ved med at ændre sig, men jeg syntes ikke det er nogen helt optimal løsning.
Avatar billede spif2001 Nybegynder
09. juni 2006 - 15:12 #3
Så kender jeg ikke andre metoder, end at fortælle det andet program, at det kun må skrive i filer, hvis de bliver låst for både read og write.
Avatar billede lifo Nybegynder
09. juni 2006 - 18:50 #4
Hvad med at bruge FileSystemWatcher til at overvåge de mapper filerne ligger i ?
Avatar billede md_craig Nybegynder
09. juni 2006 - 21:42 #5
Ved ikke i .NET men min interesse for Windows API'et på det seneste lod mig falde over:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/getfileattributesex.asp

BOOL GetFileAttributesEx( LPCTSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId,  LPVOID lpFileInformation );

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/win32_file_attribute_data_str.asp
typedef struct _WIN32_FILE_ATTRIBUTE_DATA {  DWORD dwFileAttributes;  FILETIME ftCreationTime;  FILETIME ftLastAccessTime;  FILETIME ftLastWriteTime;  DWORD nFileSizeHigh;  DWORD nFileSizeLow;
} WIN32_FILE_ATTRIBUTE_DATA,  *LPWIN32_FILE_ATTRIBUTE_DATA;

der igennem kan man jo hvertfald få en Last Access time...
Avatar billede md_craig Nybegynder
09. juni 2006 - 22:30 #6
Den skulle ligge på File.GetLastAccessTime(file)
Men ser ud til at det giver samme prob...
Avatar billede arne_v Ekspert
10. juni 2006 - 02:05 #7
Har du prøvet at åbne filen med den FileStream constructor der som 4. argument
tager en FileShare.None ?
Avatar billede Spotgun Seniormester
10. juni 2006 - 09:22 #8
Det ser ud til at FileShare.None virker. Jeg troede ellers kun den havde nogen betydning når man skulle skrive til en fil, men umiddelbart i de tests jeg har lavet, ser det ud til at den også fungerer som en slags "exclusive read lock", når man bruger en FileStream til at læse filen med.

Kommer du med et svar Arne?
Avatar billede arne_v Ekspert
10. juni 2006 - 15:16 #9
gerne
Avatar billede md_craig Nybegynder
12. juni 2006 - 14:36 #10
Vil da så indbyde at jeg faktisk prøvede det på et Word 2007 dokument, virkede ikke hos mig...

Virkede på den måde at word bare mistede skriverettigheden og når man så ville gemme der fra med alm. gem kom den med "gem som" menuen...
Avatar billede Spotgun Seniormester
12. juni 2006 - 14:42 #11
Det er noteret. I den sammenhæng jeg skal bruge den er det dog okay med den opførsel, da de programmer der skriver filerne i mappen altid vil skrive dem i et hug og så slippe filerne.
Avatar billede arne_v Ekspert
12. juni 2006 - 14:56 #12
det er formentligt fordi Word netop ikke holder filen aaben

open
read
close
lad bruger redigere
open
write
close

er meget svaer at detecte fra et andet program !

(for Word kan man vistnok kigge efter backup/work filen den med tilde i)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester