Share via


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.

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