【问题标题】:Java file last modified returns 0Java 文件最后修改返回 0
【发布时间】:2018-03-07 12:13:29
【问题描述】:

我有以下代码来检查保存在网络驱动器上的文件的最后修改。

private long determineLastEdit(ILoaderData file) {

    String localDir = "c:\\Software\\log\\"; 
    String localPDF = "empty28.pdf";
    String originDir = "smb:\\ProdName\\ShareName\\Temp\\username\\path\\to\\folder\\";
      //My company remote storage

    File localFile = new File(originDir + localPDF)
      //this does not work

    //File localFile = new File(localDir + localPDF)
      //this works as expected

    Date currentTime = new Date();
    long timeCurrent = currentTime.getTime();
    long timeFile = localFile.lastModified();
      //this returns 0 on remote, correct time on local

    boolean fileEx = localFile.isFile(); //returns false on remote, true on local
    boolean fileTp = localFile.isAbsolute(); //returns false on remote, true on local


    long difference = Math.abs(timeCurrent - timeFile);

    return difference;

}

文件构造函数的参数如下:

smb:\\\ProdName\\\ShareName\\\Temp\\\username\\\path\\\to\\\folder\\\empty28.pdf

但是,lastModified() 方法由于某种原因返回 0,我做错了什么?该文件没有任何类型的锁定,它是常规的(尽管是空 PDF)。

EDIT1:我在本地文件上测试了该方法,路径为:

c:\\\Software\\\log\\\empty28.pdf

返回的值是正确的,我怀疑该方法不允许在给定文件上执行,因为它位于网络驱动器上。但是,此检查发生在已授权的一个线程上。不知道错误在哪里。

EDIT2:我更新了代码以提供更好的示例。现在,似乎问题在于从网络驱动器读取文件

EDIT3 我尝试使用不同的方法。导入:

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

并添加代码:

Path path = Paths.get(localDir + localPDF);
BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);

同样的结果,本地驱动器工作,远程不工作。

【问题讨论】:

  • boolean fileEx = localFile.isFile(); //returns false? “返回错误”似乎很重要......
  • 确实如此,在我看来它甚至没有注册文件,但这对我来说几乎没有意义。将在本地文件上进行测试。
  • 如果返回0,则表示该文件不存在。 docs.oracle.com/javase/7/docs/api/java/io/…
  • 我用本地文件测试了实现,它工作正常,更新了问题。

标签: java file time jcifs


【解决方案1】:

就这么简单(注意:我包含了日期格式):

String localPDF = "empty28.pdf";
String originDir = "\\\\smb\\ProdName\\ShareName\\Temp\\username\\path\\to\\file\\";

File file = new File(originDir + localPDF);   
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

System.out.println(sdf.format(file.lastModified()));

【讨论】:

  • 我可以确认这可行,但不适用于保存在网络共享驱动器上的文件。
  • @LoneWanderer 它确实适用于网络;也许尝试编辑你的路径? - 我稍微更新了我的答案(注意四个斜线)
  • 我带来新闻!我用这两种方法都试过了。使用原始实现,仍然不起作用,但是当我检查路径是否是绝对路径时,它返回 true 。这意味着路径是正确的,但它仍然无法识别该文件。当我使用第二个实现(因此是 EDIT 3)时,我得到和异常 the network path was not found 这个路径 \\smb\ProdName\ShareName\Temp\username\path\to\file\empty28.pdf
  • 不确定我的人,我实际上只是创建了那个确切的路径(将 smb 更改为我系统上已经存在的路径)并且它按预期执行;如果将路径粘贴到运行框中(假设是 Windows),它会打开文件夹吗? (\\smb\ProdName\ShareName\Temp\username\path\to\file)。如果是这样,您是否添加了额外的斜杠,即每个斜杠加倍 - IDE 可能会自动执行此操作。
  • 有趣的是,不,它没有。我会认为那是我的问题。我尝试使用我的映射驱动器(因为我将此共享映射到 Z :),它的工作原理很吸引人,但这可能是因为 Windows 将其视为逻辑驱动器。有没有办法获取该特定位置的网络地址?
【解决方案2】:

根据Javadocs方法lastModified:

返回一个表示文件最后修改时间的长值,以自纪元(格林威治标准时间 00:00:00,1970 年 1 月 1 日)以来的毫秒数为单位,如果文件不存在或 I/O,则返回 0L发生错误。

因此,请检查您传递给文件构造函数的 URL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多