共用方式為


符號連結上的時間欄位

當變更符號連結 ("symlink") 上的下列時間相關欄位時,更新現在只會影響符號連結本身,而不會影響目標:

先前的行為

先前更新符號連結上任何時間相關的欄位,會影響符號連結之目標的欄位。

請考慮下列程式,其會先將各種時間欄位值列印在檔案及其符號連結上,再將符號連結的時間欄位值更新為 1 天後,然後重新將時間欄位值列印在檔案和符號連結上。

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

之前在更新符號連結上的這些值後,只有目標檔案的時間欄位會更新。 上述程式的輸出如下所示:

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

新的行為

自 .NET 7 起,更新符號連結上的任何時間相關欄位,都只會影響符號連結本身的欄位,而不會影響目標檔案。

先前的行為一節中所示之該程式的輸出如下所示:

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

導入的版本

.NET 7 Preview 1

中斷性變更的類型

這項變更會影響二進位相容性

變更原因

先前的行為在某些情況下既未預期,也非預期:

  • 其和取得相同欄位之屬性和方法的行為不一致。
  • 其也不可能使用 .NET API 實際更新符號連結本身中的欄位。

若您利用此行為,設定符號連結之目標上的值,則在設定符號連結中的任一個 *Time 欄位時,將不再會影響目標。 您可以使用新的符號連結 API,取得符號連結的目標,然後改為更新該檔案系統物件。

FileSystemInfo? targetInfo = linkInfo.ResolveLinkTarget(returnFinalTarget: true);
if (targetInfo  != null)
{
    // Update the properties accordingly.
    targetInfo.LastWriteTime = DateTime.Now;
}

受影響的 API