【问题标题】:How & What does the delete method for a file actually delete?文件的删除方法实际上是如何删除的?
【发布时间】:2015-10-26 03:16:33
【问题描述】:

假设我创建了一个 txt 文件并将其保存为 "Untitled1"。我进入eclipse并输入以下内容:

import java.io.*;
public class Test {

public static void main(String[] args){
File f = new File("Untitled1.txt");
boolean isDeleted = f.delete();

System.out.println(isDeleted);

       }
}

delete 方法返回 False,表明文件未被删除。我知道文件对象代表文件的位置,而不是文件的内容。但是实际上被删除的是什么?如何在不删除文件本身内容的情况下删除文件的位置?

我还输入了 Untitled1 文件的文件路径作为 File 对象构造函数的参数,它也没有删除 Untitled1.txt 文件。

【问题讨论】:

  • 尝试给出完整路径,然后它会删除例如新文件("C:\\Untitled1.txt");
  • 您仍然需要提供绝对路径没关系,否则 f 将为空,而 delete 将一事无成。因为它什么都不做,所以不会有任何异常。

标签: java file serialization io directory


【解决方案1】:

因此,文件本身被删除。 False 可能由于多种原因而被退回。

public boolean delete()

删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能被删除。 请注意,Files 类定义了delete 方法以在无法删除文件时抛出IOException。这对于错误报告和诊断无法删除文件的原因很有用。

返回: true 当且仅当文件或目录被成功删除; false 否则

投掷:

SecurityException - 如果安全管理器存在并且其SecurityManager.checkDelete(java.lang.String) 方法拒绝删除对文件的访问权限

捕获SecurityException,您可能会发现不允许以编程方式直接删除文件。

【讨论】:

  • 当我编译代码时没有抛出异常。我在文件对象被实例化之前创建了一个 try 块,并在 print 语句之后关闭了该块。然后,我放置了一个 catch 块来捕获泛型类型 Exception 的异常,其中包含一个 printStackTrace 方法。但是没有发现异常。
  • 不要发布文字图片。浪费您的时间和我们的带宽。发布文本。
  • 你明白了。将删除
  • EJP 建议您将其替换为文本,而不是完全删除它。我以文本形式添加回来。如果需要,将其修剪或再次删除。我认为这是有用的信息。
【解决方案2】:

首先,请注意File 是一个旧的bad 类,现在不应该使用。

使用Files 类要好得多,尤其是它的delete 方法。

至于删除的具体内容:文件是位于硬盘中的一堆字节。磁盘 - 或其分区之一 - 被格式化为 文件系统,这是一种组织目录和文件的数据结构。特定的文件系统决定了文件如何被分解成片段,这些片段如何被诸如seekreadwrite之类的操作定位或添加> 等等

文件系统有目录,这些目录为您提供文件的起点。目录层次结构中的文件路径告诉系统在哪里可以找到文件,包括它的所有信息(如指向其开始的指针、读/写权限等)。目录中告诉实际文件内容在哪里的信息是有时称为“链接”(至少在 Unix 文件系统中)。

当您删除一个文件时,通常会发生从该目录到该文件的特定链接被删除。如果这是最后一个链接(文件可以从多个目录链接,至少在某些文件系统中),属于该文件的块也被标记为空闲,以便可以将它们分配给另一个文件。

所以你的File 对象告诉系统文件在哪里,但delete 操作最终告诉系统从目录(路径的倒数第二部分)取消链接文件,如果这是最后一个链接,它还告诉系统转​​到文件内容并将其标记为免费。

这是一般描述。确切的细节以及内容被标记为免费时会发生什么取决于所使用的特定文件系统(例如 ext4、reiserFS... (Linux)、HFS+ (MacOS X)、NTFS、FAT32... (Windows))。

【讨论】:

    【解决方案3】:

    文件通过文件系统的路径标识,从根节点开始。

    路径的表示取决于系统。例如在 Windows 中 C:\foo\bar 而在 linux 中 /home/foo/bar

    所以在下面的代码中,字符串路径将被转换为抽象路径名,它会创建File 实例,当你调用delete 方法时,它会尝试删除节点。基本上内容和路径并没有什么不同。

    File f = new File("Untitled1.txt");
    

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2011-02-25
      • 2014-09-06
      • 1970-01-01
      相关资源
      最近更新 更多