符號連結上的時間欄位
當變更符號連結 ("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
- 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