删除文件并创建新文件时,创建日期不会改变。

6

由于某些原因,我需要删除旧文件并根据我们的客户创建新文件。

修改日期更改为当前时间,但创建日期不会更改为当前时间。

输入图像说明 我的代码如下:

  public static void main(String args[]) throws Exception {
    FileUtils.deleteQuietly(new File("d:\\inbox\\json\\test.txt"));
    FileWriter fileWriter = new FileWriter("d:\\inbox\\json\\test.txt", false);
    fileWriter.append(new Date().toString());
    fileWriter.close();
  }

这段代码会删除旧数据并写入新数据。

但为什么创建日期时间没有改变呢?

请帮我找出代码哪里有问题。提前谢谢!


抱歉,我不小心放错了代码 现在我更新了代码,请帮忙看一下 我也尝试过// Files.delete(Paths.get("d:\\inbox\\json\\test.txt"));; // Files.deleteIfExists(Paths.get("d:\\inbox\\json\\test.txt")); - Darshan Patel
请帮我看看为什么出现了这个问题,我的代码需要做出哪些更改吗? - Darshan Patel
我也尝试了forceDelete但结果是同一个旧文件创建时间戳。请帮忙。 - Darshan Patel
我在删除文件后添加了延迟。 如果延迟为15000,则文件创建时间会更改; 如果延迟为14000,则文件创建时间不会更改。为什么系统会表现出这样的行为? - Darshan Patel
8个回答

4
这是由于Windows中的文件系统隧道导致的。有禁用/配置它的选项。您可以从此链接获取更多信息:support.microsoft.com
为了以Java方式抵消这种情况,您可以在文件创建后立即设置文件创建时间(文件属性),如下所示的代码。
public static void main(String args[]) throws Exception {
        final String FILE_PATH = "d:\\test.txt";
        FileUtils.deleteQuietly(new File(FILE_PATH));
        FileWriter fileWriter = new FileWriter(FILE_PATH, false);
        fileWriter.append(new Date().toString());
        fileWriter.close();
        setFileCreationTime(FILE_PATH);

    }

    public static void setFileCreationTime(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        FileTime fileTime = FileTime.fromMillis(System.currentTimeMillis());
        /* Changing the Created Time Stamp */
        Files.setAttribute(path, "basic:creationTime", fileTime,
                LinkOption.NOFOLLOW_LINKS);
    }

希望这能有所帮助。

@SintoKltteera 绝妙的答案 感谢您的帮助。 还有一个小问题,其他操作系统(例如Unix、Mac)是否存在相同的问题? 因为当我搜索时,我发现Unix操作系统不存储创建时间!!! - Darshan Patel

4
这是一个NTFS问题。当您重新创建文件时,系统会缓存文件信息并重复使用它。
请参见http://msdn.microsoft.com/en-us/library/system.io.file.getcreationtime%28v=vs.110%29.aspx中的备注部分。
NTFS格式化的驱动器可能会在短时间内缓存有关文件(如文件创建时间)的信息。因此,如果您要覆盖或替换现有文件,则可能需要显式设置文件的创建时间。
谢谢!
PS:您可以使用这些命令查看它,而无需使用Java代码:
del test.txt

echo test > test.txt

dir /TC test.txt

+1 鼓励你为我找到解决方案 这可能是一个原因, 但是当使用文件资源管理器从 Windows 中删除和创建文件时,为什么会有正确的创建时间? 此时操作系统使用不同的函数,请解释一下。 - Darshan Patel
我不知道文件浏览器是如何工作,也不知道它如何处理文件系统,但是让我们试着用以下命令创建一个 .bat 文件: del test.txt echo test > test.txt dir /TC test.txt 你会发现这不是一个Java问题。 - eltabo

0

您正在追加到给定日期创建的文件中,这不会创建新文件(这将为您提供创建日期)。您要做的是将原始文件的内容复制到某个地方(例如数组),然后删除该文件,再写入一个包含所有原始内容以及您想要追加的内容的新文件。

尽管您的描述暗示这不是您想让此代码执行的操作,但您的描述意味着您想要删除旧文件并仅保留新内容,在这种情况下,您应该执行以下操作:

public static void main(String args[]) throws Exception {
        File f=new File("d:\\inbox\\json\\test.txt");
        if (f.exists()) {
            f.delete();
        }
        f.createNewFile();
        FileWriter fileWriter = new FileWriter("d:\\inbox\\json\\test.txt", false);
        fileWriter.write(new Date().toString());
        fileWriter.close();
    }

0

您的createNewFile()调用不会删除现有文件,它只会在不存在文件时创建一个新文件。

您需要执行以下操作:

if (f.exists()) {
    f.delete();
}

我尝试了,但是问题依旧。 - Darshan Patel

0

我还没有确切地尝试过这个。但我相信这是因为您的文件对象没有被垃圾回收。

File f = new File("test.txt");
if(f.exists()){
f.delete();
}

现在这非常重要。你想创建一个新文件。这不会分配到与你删除第一个文件相同的内存地址。

File f2 = new File("test.txt");
f2.write bla bla.

我尝试设置 f=null,然后使用 System.gc() 运行垃圾回收器,但问题仍然存在。 - Darshan Patel

0

我认为你的代码没有删除文件,而是只是将内容追加到未被删除的文件中。为了检查这一点,我建议你修改代码。

FileWriter fileWriter = new FileWriter("d:\\inbox\\json\\test.txt", false);
fileWriter.append(new Date().toString());
fileWriter.close();

System.out.println("Exists: " + Files.exists(Paths.get("d:\\inbox\\json\\test.txt"));
FileWriter fileWriter = new FileWriter("d:\\inbox\\json\\test.txt", false);
fileWriter.append(new Date().toString());
fileWriter.close();

如果你在控制台中看到 Exists: true,那就是你遇到了问题。

@faith操作存在:false,而commons-io的FileUtils.deleteQuietly删除文件。 - Darshan Patel
看起来你的文件系统可能有问题?你的代码在我这里可以运行。你尝试过使用另一个文件吗?你的驱动器使用NTFS格式吗? - fatih
@faith 是的,我尝试了不同的文件而且我使用的是 NTFS 文件系统。 - Darshan Patel

0

在写入文件之前,您没有删除该文件。


0
如果在重新创建文件之前不删除它,则只会修改它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接