2012-11-16 32 views
5

Cho rằng Microsoft đã deprecated Transactional NTFS (TxF):Alternatives để sử dụng giao dịch NTFS

Microsoft khuyến cáo nhà phát triển sử dụng phương tiện thay thế để đạt được những nhu cầu của ứng dụng của bạn. Nhiều kịch bản mà TxF đã được phát triển cho có thể đạt được thông qua các kỹ thuật đơn giản và dễ dàng hơn. Hơn nữa, TxF có thể không có sẵn trong các phiên bản tương lai của Microsoft Windows.

Trong khi TxF là một tập hợp API mạnh mẽ, đã có rất ít sự quan tâm của nhà phát triển trong nền tảng API này vì Windows Vista chủ yếu là do sự phức tạp và các sắc thái khác nhau mà nhà phát triển cần xem xét như một phần của phát triển ứng dụng. Kết quả là, Microsoft đang xem xét việc không dùng API TxF trong phiên bản Windows tương lai để tập trung nỗ lực phát triển và bảo trì trên các tính năng và API khác có giá trị hơn cho đa số khách hàng lớn hơn.

Điều này có nghĩa rằng tôi cần một thay thế cho:

yêu cầu giao dịch của tôi là khá đơn giản - di chuyển hai tập tin:

tx = BeginTransaction(); 
{ 
    MoveFile(testResults, testResultsArchive); //throws if there's a problem 
    MoveFile(cdcResponse, cdcResponseArchive); //throws if there's a problem 

    CommitTransaction(tx); 
} 
finally 
{ 
    CloseHandle(tx); 
} 

tôi đã nghĩ đến việc quay MoveFile để CopyFile + DeleteFile:

CopyFile(testResults, testResultsArchive); //throws if there's a problem 
CopyFile(cdcResponse, cdcResponseArchive); //throws if there's a problem 

DeleteFile(testResults); 
DeleteFile(cdcResponse); 

Nhưng tôi đã hy vọng cho một giải pháp tốt , không phải là một giải pháp lỗi. Vì vậy, tôi cố gắng một lần nữa:

CopyFile(testResults, testResultsArchive); //throws if there's a problem 
CopyFile(cdcResponse, cdcResponseArchive); //throws if there's a problem 

try 
{ 
    DeleteFile(testResults); 
} 
catch (Exception e) 
{ 
    DeleteFile(testResultsArchive); 
    throw e; 
} 
try 
{ 
    DeleteFile(cdcResponse); 
} 
catch (Exception e) 
{ 
    DeleteFile(cdcResponseArchive); 
} 

Trừ tôi đã hy vọng cho một giải pháp tốt , không phải là một lỗi.

Trả lời

3

Tặng thử .NET Transactional File Manager. Nó khá đơn giản để sử dụng nó một cách an toàn. Ví dụ sau đây từ trang hiển thị đường đi. Nó thậm chí trông giống như tác giả là đáp ứng và có thể mở rộng thư viện với các tính năng hữu ích mới.

// Wrap a file copy and a database insert in the same transaction 
TxFileManager fileMgr = new TxFileManager(); 
using (TransactionScope scope1 = new TransactionScope()) 
{ 
    // Copy a file 
    fileMgr.Copy(srcFileName, destFileName); 

    // Insert a database record 
    dbMgr.ExecuteNonQuery(insertSql); 

    scope1.Complete(); 
} 

Trong trường hợp bạn quan tâm đến người quản lý giao dịch của riêng mình, hãy chắc chắn bạn xem this bài viết. Nếu bạn cẩn thận kiểm tra các thư viện được đề cập ở trên, bạn sẽ thấy rằng nó được thực hiện theo cách này.

+1

tôi đã xem qua nguồn. Các "rollback" vẫn còn sôi xuống 'File.Delete (path);'; mà bị vấn đề có lẽ không thể xóa các tập tin. Giải pháp * "real" * liên quan đến việc sử dụng 'CreateFile' và thực hiện lại' CopyFile', để bạn có thể [hồi tiếp báo hiệu xử lý "xóa tệp khi tay cầm được đóng"] (http://stackoverflow.com/ câu hỏi/14572272/how-to-un-createfile). Nhưng nếu các vấn đề liên quan đến tính toàn vẹn giao dịch không phải là một mối quan tâm trọng (và tôi đã sử dụng .NET), tôi sẽ sử dụng một cái gì đó như thế này. Đã chấp nhận. –

3

Từ liên kết:

Do vậy, Microsoft đang xem xét ti TxF API

Nó không phải là chết chưa! Tôi không biết tại sao họ sẽ xóa một API hệ thống tệp nguyên tử cho Windows, ngay cả khi nó chưa được hỗ trợ phần lớn. Nên có một .NET BCL cho dễ sử dụng tận dụng TxF cho người mới bắt đầu. Hỗ trợ kiểu TxF cho các bản sao mạng cũng sẽ rất tuyệt vời.

Nếu có, Microsoft sẽ cải tiến API!

+2

Tôi đồng ý. Nhưng chúng tôi là nơi chúng tôi đang có. –

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