1 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
我在使用 OpenJDK 13 的 Windows 10 上看到了相同的行為。雖然您提到文件資源管理器中的創(chuàng)建時間是正確的,但通過 Java 查詢時則不然。我的經(jīng)歷是不同的;文件資源管理器顯示正確的(即保留的)上次修改時間,但是當(dāng)我打開副本的屬性對話框時,創(chuàng)建時間設(shè)置為復(fù)制文件時。
請注意,雖然不保留創(chuàng)建時間可能是不可取的,但我不確定這是否會被視為 Java 中的錯誤。的文檔Files#copy(Path,Path,CopyOption...)
說:
嘗試將與此文件關(guān)聯(lián)的文件屬性復(fù)制到目標文件。復(fù)制的確切文件屬性取決于平臺和文件系統(tǒng),因此未指定。
last-modified-time
如果源文件存儲和目標文件存儲都支持,則至少會復(fù)制到目標文件。復(fù)制文件時間戳可能會導(dǎo)致精度損失。
COPY_ATTRIBUTES
- 來自選項表中的描述。
正如您所看到的,至少只會復(fù)制最后修改時間,即使這樣也不一定得到保證。這也表明問題可能是特定于平臺的;如果 Windows,或者至少 Java 使用的 Windows API,不支持保留創(chuàng)建時間,那么您所看到的就是預(yù)期的行為。但如果您認為該行為是一個錯誤,您可以隨時提交錯誤報告。不過,在此之前,請確保報告尚不存在,包括已解決的報告,例如“無法修復(fù)”的報告。
注意:以上段落主要針對 Windows。不幸的是,我目前無法訪問其他操作系統(tǒng),因此我無法測試其他操作系統(tǒng)是否有同樣的問題。您從未明確提及您正在使用Windows,盡管我假設(shè)您是基于問題中的路徑(即"C:\\Users\\..."
)以及您對“explorer”一詞的使用。
也就是說,我相信可能有一個解決方法:在復(fù)制目錄或文件后自行復(fù)制創(chuàng)建時間:
Files.copy(source, target, options); // 'options' should include COPY_ATTRIBUTES
Files.setAttribute(target, "creationTime", Files.getAttribute(source, "creationTime"));
COPY_ATTRIBUTES注釋說應(yīng)該包含在內(nèi)的原因是,正如記錄的那樣,該選項可能會導(dǎo)致復(fù)制任意數(shù)量的屬性,即使創(chuàng)建時間不是其中之一。當(dāng)然,如果您想確保最后修改時間和訪問時間也被復(fù)制,您可以將上面的內(nèi)容修改為:
Files.copy(source, target, options); // 'options' should include COPY_ATTRIBUTES
BasicFileAttributes srcAttrs = Files.readAttributes(source, BasicFileAttributes.class);
BasicFileAttributeView tgtView = Files.getFileAttributeView(target, BasicFileAttributeView.class);
tgtView.setTimes(srcAttrs.lastModifiedTime(), srcAttrs.lastAccessTime(), srcAttrs.creationTime());
可能有趣的是,它Files#copy(Path,Path,CopyOption...)所做的事情與第二個示例非常相似,但前提是源和目標具有不同的FileSystemProvider實例。否則,該方法將委托給共享FileSystemProvider,這對于每個實現(xiàn)都是不同的。
添加回答
舉報