2012-11-16 8 views
5

Da Microsoft deprecated Transactional NTFS (TxF) hat:Alternativen zur Verwendung von Transactional NTFS

Microsoft empfiehlt dringend, Entwickler nutzen alternative bedeutet die Notwendigkeiten der Anwendung zu erreichen. Viele Szenarien, für die TxF entwickelt wurde, können durch einfachere und leichter verfügbare Techniken erreicht werden. Darüber hinaus ist TxF in zukünftigen Versionen von Microsoft Windows möglicherweise nicht verfügbar.

Während TxF ein leistungsstarker Satz von APIs ist, gab es ein extrem begrenztes Entwicklerinteresse an dieser API-Plattform seit Windows Vista hauptsächlich aufgrund seiner Komplexität und verschiedenen Nuancen, die Entwickler als Teil der Anwendungsentwicklung berücksichtigen müssen. Aus diesem Grund erwägt Microsoft, TxF-APIs in einer zukünftigen Version von Windows abzuschaffen, um die Entwicklungs- und Wartungsanstrengungen auf andere Funktionen und APIs zu konzentrieren, die für eine größere Mehrheit von Kunden einen höheren Wert haben.

Das bedeutet, dass ich eine Alternative zu müssen:

Meine getätigten Anforderungen sind ziemlich einfach - bewegen zwei Dateien:

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); 
} 

Ich habe darüber nachgedacht, MoveFile Drehen um CopyFile + DeleteFile:

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

DeleteFile(testResults); 
DeleteFile(cdcResponse); 

Aber ich für eine Lösung gute Lösung, kein Buggy hatte gehofft. Also versuche ich wieder:

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); 
} 

Außer ich für eine gute Lösung gehofft wurde, kein Buggy ein.

Antwort

3

Versuchen Sie es mit .NET Transactional File Manager. Es ist ziemlich einfach, es sicher zu verwenden. Das folgende Beispiel von der Seite zeigt den Weg. Es sieht sogar so aus, als wäre der Autor reaktionsfähig und in der Lage, die Bibliothek um neue nützliche Funktionen zu erweitern.

// 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(); 
} 

Falls Sie in Ihrem eigenen Transaktionsmanager interessiert sind, sollten Sie this Artikel überprüfen. Wenn Sie die oben genannte Bibliothek sorgfältig untersuchen, werden Sie feststellen, dass sie auf diese Weise richtig umgesetzt wird.

+1

Ich schaute auf die Quelle. Der "Rollback" läuft immer noch auf 'File.Delete (path);'; Das Problem ist möglicherweise nicht in der Lage, die Datei zu löschen. Die * "echte" * Lösung beinhaltet die Verwendung von 'CreateFile' und das erneute Implementieren von' CopyFile', so dass Sie das Handle rückwirkend anweisen können, "Datei zu löschen, wenn das Handle geschlossen ist" (http://stackoverflow.com/) Fragen/14572272/how-to-un-createfile). Aber wenn die Probleme, die mit der transaktionalen Integrität verbunden sind, kein vorrangiges Problem darstellen (und ich .NET verwende), würde ich etwas wie dieses verwenden. Akzeptiert. –

3

Aus dem Link:

Als Ergebnis erwägt Microsoft TxF APIs

Es ist noch nicht tot ironischen! Ich weiß nicht, warum sie eine atomare Dateisystem-API für Windows entfernen würden, auch wenn sie noch nicht weitgehend unterstützt wird. Es sollte eine .NET-BCL geben, um die Benutzerfreundlichkeit von TxF für Anfänger zu erhöhen. TxF-Stil-Unterstützung für Netzwerkkopien wäre auch toll.

Wenn überhaupt, sollte Microsoft die API verbessern!

+2

Ich stimme zu. Aber wir sind, wo wir sind. –

Verwandte Themen