2008-10-15 13 views
14

Próbuję użyć StreamReader do odczytu pliku, ale zawsze jest używany przez inny proces, więc ten błąd:Czy mogę po prostu "odczytać" plik, który jest w użyciu?

The process cannot access the file '\arfjwknasgmed17\C$\FLAG CONDITION\CP-ARFJN-FLAG.XLS' because it is being used by another process.

Czy istnieje sposób mogę przeczytać to bez kopiowania go? A może to moja jedyna opcja?

Odpowiedz

25

Plik można odczytać tylko wtedy, gdy program, który otworzył plik po raz pierwszy, odczytuje prawa udostępniania dla tego pliku.

Jeśli jednak plik rzeczywiście nie ma praw do udostępniania, jego skopiowanie nie byłoby możliwe.

Możesz nie mieć dostępu do pliku, jeśli określasz prawo do udostępniania, które jest w konflikcie z prawem do udostępniania programu, który już ma otwarty plik. Na przykład nie można przyznać prawa do zapisu, jeśli program, który już je otworzył, nie przyznaje prawa do zapisu.

Jeśli program, który otworzył plik w pierwszej kolejności obsługuje funkcję Volume Shadow Copy (VSS), można również użyć usługi VSS w celu uzyskania dostępu do pliku.

Istnieją komercyjne sterowniki oprogramowania, które umożliwiają dostęp do takich plików, nawet gdy są w użyciu. Kiedyś byłeś w stanie zdobyć Open File Manager przez St-Bernards, a także możesz używać File Access Manager (FAM) przez VisionWorks Solutions Inc. Sterowniki te są zwykle OEM do tworzenia kopii zapasowych firm oprogramowania do włączenia ich produktów.

Usługa VSS działa, mówiąc programowi, który ma już otwarty plik, który inny program chciałby odczytać z pliku. VSS wykonuje następnie kopię pliku i umożliwia odczytanie z tej kopii. Usługa VSS nie działa w przypadku starszych aplikacji.

FAM działa w sposób przejrzysty zarówno w przypadku programów starszych, jak i nieobjętych prawem, określając "dozwoloną listę" aplikacji, które mają dostęp wyłącznie do plików otwartych i zablokowanych. Tylko programy z tej listy mają dostęp do tych plików. Kiedy plik jest otwierany, przechodzi w tryb pamięci podręcznej, dzięki czemu otrzymasz kopię pliku, tak jak to było w momencie uruchomienia "kopii zapasowej/otwarcia" pliku. W tym momencie program, który pierwotnie otworzył plik, widzi ten plik tak, jak jest, a drugi program na liście dozwolonych plików widzi ten plik tak, jak był, gdy wydano plik "open/backup". Zapewnia to spójność pliku.

2

wypróbuj poniższy kod.

FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
fileStream = new StreamReader(fileStr); 

Próbowałem go w systemie Windows XP. Jeśli plik jest już otwarty w trybie zapisu przez inny proces &, nie określił uprawnień do udostępniania, nadal będzie można otworzyć plik w trybie odczytu.

Zastrzeżenie: Działa, ale nie jestem pewien, czy należy go użyć w kodzie produkcyjnym. Nie jestem jeszcze w stanie znaleźć żadnej formalnej dokumentacji, która mówi, że powinna działać.