.NET Framework - File.SetCreationTimeUtc

Asked By Matthias Heise on 21-Apr-10 02:05 AM
Hallo.

Ich hab eine Frage zur Performance bzw. Anzahl der Filesystem IO Zugriffe.
Folgender Code hat im Grunde drei IO Zugriffe. L??sst sich das sinnvoll in
einem using-Block zusammenfassen und somit performanter gestalten?

using (FileStream stream = new FileStream(localFile, FileMode.Create,
FileAccess.Write))
{
stream.Write(data, 0, data.Length);
}

File.SetLastWriteTimeUtc(localFile, newFileInfo.Modified);
File.SetCreationTimeUtc(localFile, newFileInfo.Modified);

Danke im Voraus.

Matthias Heise




Thomas Scheidegger replied to Matthias Heise on 21-Apr-10 06:04 AM
Hallo Matthias



in der Tat weicht .NET hier von der Win32-Vorgabe 'SetFileTime' ab,
welche auf ein offenes File-Handle wirkt, nicht auf expliziten Pfad.
Jeder Aufruf von
File.SetLastXXXTimeUtc
macht die Win32-Sequenz: CreateFile + SetFileTime + CloseHandle.
Was nat??rlich f??r Performance sehr negativ ist.
(abgesehen dass Win32-SetFileTime auch alle 3 Zeiten aufs mal ver??ndern
k??nnte)


--
Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/
Matthias Heise replied to Thomas Scheidegger on 22-Apr-10 04:05 AM
Guten Morgen.

Wir sind gestern dann auch noch auf den Win32 Call gekommen. Der zugeh??rige
Code ist dann beispielsweise wie unten stehend.

Viele Gr????e

Matthias

[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetFileTime(IntPtr hFile, ref long
lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);

[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetFileTime(IntPtr hFile, out long
lpCreationTime, out long lpLastAccessTime, out long lpLastWriteTime);

public static void SetFileTimes(SafeFileHandle safeFileHandle,
DateTime? createTime, DateTime? accessTime, DateTime? writeTime)
{
long lCreationTime = createTime.HasValue ?
createTime.Value.ToFileTime() : 0;
long lAccessTime = accessTime.HasValue ?
accessTime.Value.ToFileTime() : 0;
long lWriteTime = writeTime.HasValue ?
writeTime.Value.ToFileTime() : 0;
IntPtr hFile = safeFileHandle.DangerousGetHandle();
if (!SetFileTime(hFile, ref lCreationTime, ref lAccessTime, ref
lWriteTime))
{
throw new Exception("Setting file time failed.");
}
}