2011-07-22 45 views
8

Ngày nay tôi đang xử lý một ứng dụng nhỏ cập nhật các tệp cơ sở dữ liệu nhỏ gọn của mssql trên máy chủ iss.Sự khác biệt giữa File.Copy và File.Move

Tôi đã ưu tiên sử dụng SSIS để tổ chức luồng. Trong vài ngày nó hoạt động tốt, nhưng sau đó bắt đầu đưa ra lỗi.

Trong SSIS, tôi đã sử dụng thao tác "Di chuyển tệp" của "Hệ thống tệp" để di chuyển các tệp được tạo từ một thư mục sang thư mục chia sẻ của máy chủ. Nếu nó không thành công, trong trường hợp một tập tin bị khóa, nó sẽ thử nó sau này. Nhưng tôi đã thấy rằng đôi khi các tập tin trong thư mục đích bắt đầu biến mất.

Sau đó, tôi đã quyết định viết mã tùy chỉnh. Tôi đã xóa "Tác vụ Hệ thống Tệp" và đặt "Tác vụ Kịch bản" thay vì nó. Và viết một vài dòng trong đó.

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; 

Nó hoạt động tốt. Nhưng tôi đã thử nó bằng cách khóa tập tin đích. Tôi đã kết nối các tập tin đích trong Sql Server Management Studio (nó là một tập tin sdf). Và nó cũng hoạt động quá mức.

Và tôi đã thử nó từ hệ điều hành, bằng cách sao chép tệp nguồn và dán nó vào đích. Windows 7 hỏi tôi nếu tôi muốn ghi đè lên nó và tôi nói có và nó ghi đè lên tập tin (sao chép và thay thế) tôi sử dụng với một quá trình khác, không có cảnh báo không có lỗi. Nhưng nếu cố gắng đổi tên hoặc xóa nó không cho phép tôi làm điều đó. Hoặc nếu tôi cố gắng cắt và dán nó (Di chuyển và Thay thế) nó nói "bạn cần sự cho phép để thực hiện hành động này".

Như tôi đã hiểu, "Sao chép, xóa" và "Di chuyển" là những điều hoàn toàn khác nhau. Và tôi vẫn không thể hiểu làm thế nào tôi có thể ghi đè lên một tập tin bị khóa.

Bất kỳ ý tưởng nào?

+0

thể trùng lặp của [Sự khác nhau giữa trong làm sao chép tập tin/xóa và di chuyển] (http://stackoverflow.com/câu hỏi/6621956/sự khác biệt-giữa-trong-làm-file-copy-xóa-và-di chuyển) – BrokenGlass

+0

không có nó không phải là, tôi tự hỏi làm thế nào nó có thể ghi đè lên một tập tin bị khóa bằng cách sử dụng File.Copy. Và hai mã khối dưới đây là không giống nhau: đầu tiên 'File.Copy (SourceFile, destinationFile, true); File.Delete (SourceFile); ' thứ hai ' File.Delete (destinationFile); Tệp. Di chuyển (sourceFile, destinationFile); ' – fkucuk

Trả lời

5

Phương thức File.Move có thể được sử dụng để di chuyển tệp từ đường dẫn này sang đường dẫn khác. Phương thức này hoạt động trên ổ đĩa, và nó không ném một ngoại lệ nếu nguồn và đích giống nhau.

Bạn không thể sử dụng phương thức Di chuyển để ghi đè tệp hiện có. Nếu bạn cố gắng thay thế một tệp bằng cách di chuyển một tệp có cùng tên vào thư mục đó, bạn sẽ nhận được một IOException. Để khắc phục điều này, bạn có thể sử dụng sự kết hợp của sao chép và xóa các phương pháp

trả lời orignal từ: Difference between in doing file copy/delete and Move

+0

Thực sự tôi đã đọc bài viết bạn đã đề cập trước khi hỏi câu hỏi của tôi. Câu hỏi chính ở đây là "làm thế nào nó cho phép tôi ghi đè lên một tập tin bị khóa bởi File.Copy". Và tôi nhận ra rằng, sau khi ghi đè lên một tệp sdf khi sử dụng, nó đã bị hỏng! Tôi nghĩ rằng có nhiều hơn "bạn không thể di chuyển một tập tin nếu nó tồn tại trên đích". – fkucuk

Các vấn đề liên quan