#眉標=TxF、P/Invoke、NTFS #副標=交易式的檔案處理(1) #大標=TxF讓檔案系統也能達到交易控制 #作者=文/圖 吳剛志 =============================================== 程式1 public static void CheckFiles(string[] files) {  Console.WriteLine();  Console.WriteLine("確認檔案是否存在?");  foreach (string file in files)  {   Console.WriteLine(   " - 檔案({0}): {1}",   file,   File.Exists(file)? "存在":"不存在");  }  Console.WriteLine(); } public static void Main(string[] args) {  // 建立 KTM transaction object  IntPtr transaction = CreateTransaction(   IntPtr.Zero,   IntPtr.Zero,   0, 0, 0, 0,   null);  string[] files = new string[] {   @"c:\file1.txt",   @"c:\file2.txt",   @"c:\file3.txt"};  CheckFiles(files);   try { foreach (string file in files) {    Console.Write("刪除檔案({0}): ", file);    // 使用支援交易的 delete file API    if (DeleteFileTransactedW( file, transaction) == true) { Console.WriteLine("刪除成功"); }    else    { Console.WriteLine("刪除失敗"); throw new FileNotFoundException( "can not delete file", file);    } }  // 認可交易   Console.WriteLine("認可交易");   CommitTransaction(transaction); }  catch (Exception)  {  // 還原交易   Console.WriteLine("還原交易");   RollbackTransaction(transaction); } CloseHandle(transaction); CheckFiles(files); } ================================================ =============================================== 程式2 [DllImport("Kernel32.dll")] private static extern bool DeleteFileTransactedW( [MarshalAs(UnmanagedType.LPWStr)]string file, IntPtr transaction); [DllImport("Kernel32.dll")] private static extern bool CloseHandle(IntPtr handle); [DllImport("Ktmw32.dll")] private static extern bool CommitTransaction( IntPtr transaction); [DllImport("Ktmw32.dll")] private static extern bool RollbackTransaction( IntPtr transaction); [DllImport("Ktmw32.dll")] private static extern IntPtr CreateTransaction( IntPtr securityAttributes, IntPtr guid, int options, int isolationLevel, int isolationFlags, int milliSeconds, string description); ========================================================= =============================================== 程式3 public static void Main(string[] args) { // 建立 KTM transaction object IntPtr transaction = CreateTransaction( IntPtr.Zero, IntPtr.Zero, 0, 0, 0, 0, null); string[] files = new string[] { @"c:\file1.txt", @"c:\file2.txt", @"c:\file3.txt"}; CheckFiles(files); try { foreach (string file in files) { Console.Write("刪除檔案({0}): ", file); // 使用支援交易的 delete file API if (DeleteFileTransactedW( file, transaction) == true) { Console.WriteLine("刪除成功"); } else { Console.WriteLine("刪除失敗"); throw new InvalidOperationException(); } } // 在交易中(未認可) 時檢查檔案是否存在 CheckFiles(files); // 認可交易 Console.WriteLine("按下 [ENTER] 之後,認可交易..."); Console.ReadLine(); CommitTransaction(transaction); } catch (Exception ex) { // 還原交易 Console.WriteLine("還原交易:\nException: {0}", ex); RollbackTransaction(transaction); } CloseHandle(transaction); CheckFiles(files); } ========================================================= =============================================== 程式4 public static void CopyFilesTransacted(  int maxcount,  IntPtr transaction) {  bool dummy = false;  for (int count = 1; count <= maxcount; count++)  { CopyFileTransacted(   @"C:\SamplePicture.jpg",   string.Format( @"E:\Temp\TXF\FILE-{0:D05}.jpg",    count), IntPtr.Zero, IntPtr.Zero, ref dummy, 0, transaction); } } public static void CopyFiles(int maxcount) {  for (int count = 1; count <= maxcount; count++)  { CopyFile(   @"C:\SamplePicture.jpg",   string.Format( @"E:\Temp\TXF\FILE-{0:D05}.jpg",   count), false);  } } =========================================================