我正在使用以下内容更改文本文件的创建日期:
using System.IO;
...
DateTime newCreate = new DateTime(year, month, day, hour, minutes, seconds);
File.SetCreationTime("changemydate.txt", newCreate);
然而,这没有任何作用。没有错误消息,但它根本不会更改文件的日期。
我在Dropbox文件夹中以及随机文件夹中尝试了此操作
DateTime newCreate
对象似乎是正确的。
如果有人能指出我的想法,那就太好了......
答案 0 :(得分:23)
实际上,每个文件三次:
要修改这些时间,您可以使用
File.SetCreationTime(path, time);
File.SetLastWriteTime(path, time);
File.SetLastAccessTime(path, time);
分别。
看来,如果您要更改文件管理器(例如资源管理器)中显示的文件日期,您应该尝试这样的事情:
String path = @"changemydate.txt";
DateTime time = new DateTime(year, month, day, hour, minutes, seconds);
if (File.Exists(path))
File.SetLastWriteTime(path, time);
答案 1 :(得分:3)
我对此有些麻烦。这是我的代码:
FileInfo fileInfo = new FileInfo(path);
// do stuff that adds something to the file here
File.SetAttributes(path, fileInfo.Attributes);
File.SetLastWriteTime(path, fileInfo.LastWriteTime);
看起来不错,不是吗?好吧,它不起作用。
这确实可以:
FileInfo fileInfo = new FileInfo(path);
// note: We must buffer the current file properties because fileInfo
// is transparent and will report the current data!
FileAttributes attributes = fileInfo.Attributes;
DateTime lastWriteTime = fileInfo.LastWriteTime;
// do stuff that adds something to the file here
File.SetAttributes(path, attributes);
File.SetLastWriteTime(path, lastWriteTime);
而Visual Studio则无济于事。如果您在重置时间的线路上中断,调试器将报告您要回写的原始值。因此,这看起来不错,并且使您相信自己正在注入正确的日期。似乎VS不了解FileInfo对象的透明性,并且正在报告缓存的值。
FileInfo的文档说明:
首次检索属性时,FileInfo调用Refresh 方法并缓存有关文件的信息。在随后的通话中,您 必须致电刷新以获取最新信息。
嗯...显然不尽然。它似乎会自动刷新。
答案 2 :(得分:1)
您可以使用此代码示例
string fileName = @"C:\MyPath\MyFile.txt";
if (File.Exists(fileName))
{
DateTime fileTime = DateTime.Now;
File.SetCreationTime(fileName, fileTime);
}
答案 3 :(得分:1)
再次感谢大家的帮助。我现在一切都工作了,我和其他像我这样的初学者分享了所有的工作:
https://github.com/panditarevolution/filestamp
主要代码位于/FileStamp/program.cs
这是一个小命令行实用程序,允许更改文件的创建日期。我用它作为一个小小的初学者项目,教我一些关于c#和命令行界面的基础知识。它使用了有用的CommandlineParser库:
答案 4 :(得分:1)
在当前Windows 10版本的Visual Studio Community Basic中,这些语句
Dim fi As New FileInfo(someFilename)
Dim dtf As Date = CDate(someValidDateString)
fi.CreationTime = dtf
fi.CreationTimeUtc = dtf
fi.LastWriteTime = dtf
fi.LastWriteTimeUtc = dtf
fi.LastAccessTime = dtf
fi.LastAccessTimeUtc = dtf
不适用于EML文件类型(可能还有其他类型)。创作作品,其他2个保持不变。我使用此过程每年将我的电子邮件存档在一个文件夹中,并希望能够按名称或修改日期进行排序(因为这些列在资源管理器中默认存在)。 在这里,我的解决方案是将文件重命名为file +“ $”,更改日期,将文件重命名为原始文件。
答案 5 :(得分:0)
我从未遇到过SetCreationTime的问题...但我认为你可以通过getter / setter CreationTime在FileSystemInfo上设置它。也许这会更好地处理使用SetCreationTime的元信息缓存问题。
例如:
static void SetCreationTime(FileSystemInfo fsi, DateTime creationTime)
{
fsi.CreationTime = creationTime;
}