Zeitfelder in symbolischen Links
Wenn Änderungen an den folgenden zeitbezogenen Feldern in einem symbolischen Link („Symlink“) vorgenommen werden, wirken sich die Aktualisierungen jetzt auf den Symlink selbst und nicht auf das Ziel aus:
Vorheriges Verhalten
Zuvor wirkte sich das Aktualisieren eines der zeitbezogenen Felder in einem Symlink auf die Felder des Ziels des Symlinks aus.
Betrachten Sie das folgende Programm, das die verschiedenen Zeitfeldwerte für eine Datei und ihren symbolischen Link ausgibt, die Zeitfeldwerte des Symlinks auf einen Tag später aktualisiert und dann die Zeitfeldwerte sowohl für die Datei als auch für den Symlink erneut ausgibt.
string filename = "file";
string linkname = "link";
// Create a file and symlink.
File.Create(filename).Dispose();
File.CreateSymbolicLink(linkname, filename);
Console.WriteLine("Before update:");
PrintMetadata(filename);
PrintMetadata(linkname);
UpdateMetadata(linkname);
Console.WriteLine("\nAfter update:");
PrintMetadata(filename);
PrintMetadata(linkname);
static void UpdateMetadata(string filename)
{
DateTime tomorrow = DateTime.Now.AddDays(1);
File.SetCreationTime(filename, tomorrow);
File.SetLastAccessTime(filename, tomorrow);
File.SetLastWriteTime(filename, tomorrow);
File.SetAttributes(filename, File.GetAttributes(filename) | FileAttributes.Offline);
}
static void PrintMetadata(string filename)
{
Console.WriteLine($"---{filename}---");
Console.WriteLine("Creation:\t" + File.GetCreationTime(filename));
Console.WriteLine("Last access:\t" + File.GetLastAccessTime(filename));
Console.WriteLine("Last write:\t" + File.GetLastWriteTime(filename));
Console.WriteLine("Attributes:\t" + File.GetAttributes(filename));
}
Zuvor wurden nach dem Aktualisieren der Werte im Symlink nur die Zeitfelder der Zieldatei aktualisiert. Die Ausgabe des vorherigen Programms war wie folgt:
Before update:
---file---
Creation: 9/29/2022 10:35:40 AM
Last access: 9/29/2022 10:35:40 AM
Last write: 9/29/2022 10:35:40 AM
Attributes: Archive
---link---
Creation: 9/29/2022 10:35:40 AM
Last access: 9/29/2022 10:35:40 AM
Last write: 9/29/2022 10:35:40 AM
Attributes: Archive, ReparsePoint
After update:
---file---
Creation: 9/30/2022 10:35:40 AM
Last access: 9/30/2022 10:35:40 AM
Last write: 9/30/2022 10:35:40 AM
Attributes: Archive
---link---
Creation: 9/29/2022 10:35:40 AM
Last access: 9/29/2022 10:35:40 AM
Last write: 9/29/2022 10:35:40 AM
Attributes: Archive, ReparsePoint, Offline
Neues Verhalten
Ab .NET 7 wirkt sich die Aktualisierung der zeitbezogenen Felder eines Symlinks auf die Felder des Symlinks selbst und nicht auf die Zieldatei aus.
Die Ausgabe des im Abschnitt Vorheriges Verhalten gezeigten Programms lautet wie folgt:
Before update:
---file---
Creation: 9/29/2022 10:33:39 AM
Last access: 9/29/2022 10:33:39 AM
Last write: 9/29/2022 10:33:39 AM
Attributes: Archive
---link---
Creation: 9/29/2022 10:33:39 AM
Last access: 9/29/2022 10:33:39 AM
Last write: 9/29/2022 10:33:39 AM
Attributes: Archive, ReparsePoint
After update:
---file---
Creation: 9/29/2022 10:33:39 AM
Last access: 9/29/2022 10:33:39 AM
Last write: 9/29/2022 10:33:39 AM
Attributes: Archive
---link---
Creation: 9/30/2022 10:33:39 AM
Last access: 9/30/2022 10:33:39 AM
Last write: 9/30/2022 10:33:39 AM
Attributes: Archive, ReparsePoint, Offline
Eingeführt in Version
.NET 7 Preview 1
Typ des Breaking Changes
Diese Änderung kann sich auf die binäre Kompatibilität auswirken.
Grund für die Änderung
Das vorherige Verhalten war in einigen Fällen unerwartet und unerwünscht:
- Es war mit dem Verhalten der Eigenschaften und Methoden inkonsistent, die dieselben Felder abrufen.
- Es war auch nicht möglich, die Felder im Symlink selbst mithilfe von .NET-APIs zu aktualisieren.
Empfohlene Maßnahme
Wenn Sie sich auf dieses Verhalten verlassen haben, um Werte für das Symlink-Ziel festzulegen, wirkt sich das Festlegen eines der *Time
-Felder in einem Symlink nicht mehr auf das Ziel aus. Sie können die neuen symbolischen Link-APIs verwenden, um das Ziel eines Symlinks abzurufen und dann stattdessen dieses Dateisystemobjekt zu aktualisieren.
FileSystemInfo? targetInfo = linkInfo.ResolveLinkTarget(returnFinalTarget: true);
if (targetInfo != null)
{
// Update the properties accordingly.
targetInfo.LastWriteTime = DateTime.Now;
}
Betroffene APIs
- System.IO.Directory.SetCreationTime(String, DateTime)
- System.IO.Directory.SetCreationTimeUtc(String, DateTime)
- System.IO.Directory.SetLastAccessTime(String, DateTime)
- System.IO.Directory.SetLastAccessTimeUtc(String, DateTime)
- System.IO.Directory.SetLastWriteTime(String, DateTime)
- System.IO.Directory.SetLastWriteTimeUtc(String, DateTime)
- System.IO.File.SetCreationTime(String, DateTime)
- System.IO.File.SetCreationTimeUtc(String, DateTime)
- System.IO.File.SetLastAccessTime(String, DateTime)
- System.IO.File.SetLastAccessTimeUtc(String, DateTime)
- System.IO.File.SetLastWriteTime(String, DateTime)
- System.IO.File.SetLastWriteTimeUtc(String, DateTime)
- System.IO.FileSystemInfo.CreationTime
- System.IO.FileSystemInfo.CreationTimeUtc
- System.IO.FileSystemInfo.LastAccessTime
- System.IO.FileSystemInfo.LastAccessTimeUtc
- System.IO.FileSystemInfo.LastWriteTime
- System.IO.FileSystemInfo.LastWriteTimeUtc
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für