2011-07-22 23 views
8

Obecnie mam do czynienia z małą aplikacją, która aktualizuje kompaktowe pliki mssql na serwerze ISS.Różnica między File.Copy a File.Move

Wolałem używać SSIS do zorganizowania przepływu. Przez kilka dni działało dobrze, ale potem zaczęło dawać błędy.

W SSIS użyłem operacji "File File" zadania "Move File", aby przenieść wygenerowane pliki z folderu do udostępnionego folderu serwera iss. Jeśli się nie powiedzie, w przypadku zablokowanego pliku spróbuje później. Ale widziałem, że czasami pliki w folderze docelowym zaczęły znikać.

Potem zdecydowałem się napisać niestandardowy kod. Usunąłem "Zadanie systemu plików" i zamiast tego wstawiłem "Zadanie skryptu". I napisz kilka linijek.

string destinationFile, sourceFile; 
destinationFile = Path.Combine(Dts.Variables["FileRemoteCopyLocation"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString()); 
sourceFile = Path.Combine(Dts.Variables["OrginalFilePath"].Value.ToString(), Dts.Variables["CreatedFileName"].Value.ToString()); 


bool written = false; 


try 
{ 
    File.Copy(sourceFile, destinationFile, true); 
    File.Delete(sourceFile); 
    written = true; 
} 
catch(IOException) { 
    //log it 
} 


if (written) 
    Dts.TaskResult = (int)ScriptResults.Success; 
else 
    Dts.TaskResult = (int)ScriptResults.Failure; 

To działało dobrze. Ale spróbowałem, blokując plik docelowy. Połączyłem docelowy plik w Sql Server Management Studio (jest to plik sdf). I zaskakująco to też działa.

Próbowałem go z systemu operacyjnego, kopiując plik źródłowy i wklejając go do miejsca docelowego. Windows 7 pyta mnie, czy chcę go zastąpić, a ja odpowiem "tak", a on nadpisał plik (skopiuj i zamień), którego używam w innym procesie, bez ostrzeżenia bez błędu. Ale jeśli spróbuję zmienić nazwę lub usunąć to nie pozwala mi to zrobić. Jeśli spróbuję go wyciąć i wkleić (Przenieś i Zamień), oznacza to, że "potrzebujesz uprawnień do wykonania tej akcji".

Jak zrozumiałem, "Kopiuj, usuń" i "Przenieś" to zupełnie inne rzeczy. Nadal nie mogę zrozumieć, w jaki sposób mogę nadpisać zablokowany plik.

Wszelkie pomysły?

+0

możliwe duplikat [różnica między robiąc kopię pliku/delete i Move] (http://stackoverflow.com/questions/6621956/difference-between-in-doing-file-copy-delete-and-move) – BrokenGlass

+0

Nie, nie, zastanawiam się, jak można nadpisać zablokowany plik za pomocą File.Copy. a dwa bloki kodu poniżej nie są takie same: pierwszy 'File.Copy (SourceFile, destinationFile, true); File.Delete (SourceFile);' sekund 'File.Delete (destinationFile) plik. Przenieś (sourceFile, destinationFile); ' – fkucuk

Odpowiedz

5

Metoda File.Move może być używana do przenoszenia pliku z jednej ścieżki do drugiej. Ta metoda działa na woluminach dyskowych i nie generuje wyjątku, jeśli źródło i miejsce docelowe są takie same.

Nie można użyć metody Move, aby zastąpić istniejący plik. Jeśli spróbujesz zastąpić plik, przenosząc plik o tej samej nazwie do tego katalogu, otrzymasz wyjątek IOException. Aby temu zaradzić można użyć kombinacji kopiować i usuwać Metody

odpowiedzi Orignal od: Difference between in doing file copy/delete and Move

+0

Właściwie przeczytałem post, o którym wcześniej wspomniałeś, zadając moje pytanie. Głównym pytaniem tutaj jest "w jaki sposób pozwala mi zastąpić zablokowany plik przez File.Copy". I zdałem sobie sprawę, że po nadpisaniu pliku sdf podczas używania, został uszkodzony! Myślę, że jest coś więcej niż "nie można przenieść pliku, jeśli istnieje on w miejscu docelowym". – fkucuk