जावा में फ़ाइल निर्माण तिथि निर्धारित करें


102

StackOverflow ( जावा में किसी फ़ाइल की निर्माण तिथि कैसे प्राप्त करें) पर मेरा एक और समान प्रश्न है , लेकिन उत्तर वास्तव में नहीं है क्योंकि ओपी को एक अलग आवश्यकता थी जिसे अन्य तंत्रों के माध्यम से हल किया जा सकता था। मैं एक निर्देशिका में फ़ाइलों की एक सूची बनाने की कोशिश कर रहा हूं जो उम्र के अनुसार क्रमबद्ध हो सकती हैं, इसलिए फ़ाइल निर्माण की तारीख की आवश्यकता है।

मैंने वेब के बहुत से जाल के बाद ऐसा करने के लिए कोई अच्छा रास्ता नहीं बनाया है। क्या फ़ाइल निर्माण की तारीखों के लिए एक तंत्र है?

BTW, वर्तमान में एक विंडोज सिस्टम पर, लिनक्स सिस्टम पर भी काम करने के लिए इसकी आवश्यकता हो सकती है। इसके अलावा, मैं यह गारंटी नहीं दे सकता कि एक फ़ाइल नामकरण सम्मेलन का पालन किया जाएगा जहां निर्माण की तारीख / समय नाम में एम्बेडेड है।


2
ठीक है, फाइलसिस्टम में अधिक चर्चा और जांच के बाद, हमने निर्णय लिया है कि अंतिम संशोधित का उपयोग करना पर्याप्त है क्योंकि यह संभावित रूप से सृजन तिथि के साथ जांचना होगा। दोनों को यह निर्धारित करने के लिए जांचने की आवश्यकता होगी कि क्या एक पुरानी फ़ाइल को हाल ही में संशोधित किया गया था और इसलिए अभी भी सक्रिय है। तो, अतीत में सबसे दूर संशोधित फ़ाइल की जाँच करें। सभी इनपुट के लिए आपको धन्यवाद। BTW, मैं nio का उपयोग करना पसंद करूंगा, लेकिन यहां लिनक्स स्वाद वैसे भी फ़ाइल निर्माण का समर्थन नहीं करता है।
टॉड

जवाबों:


163

जावा एनआईओ के पास सृजनटाइम और अन्य मेटा-डेटा तक पहुंचने के विकल्प हैं जब तक कि फाइल सिस्टम इसे प्रदान करता है। चेक इस लिंक बाहर

उदाहरण के लिए (@ ydaetskcoR की टिप्पणी पर आधारित):

Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);

System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());

16
यह सबसे अच्छा होगा, लेकिन यह जावा 7 है। हम अभी भी 6 का उपयोग कर रहे हैं, लेकिन मैं अपने अपग्रेड विकल्पों की जांच करूंगा।
टॉड

1
बहुत खुबस। वास्तव में मुझे जरूरत थी।
रेस्टइन्पीसिटी

7
अन्य उपयोग जो readAttributes(file.toPath(), BasicFileAttributes.class)आप प्राप्त करते हैं:no suitable method found for readAttributes(File,Class<BasicFileAttributes>) method Files.<A>readAttributes(Path,Class<A>,LinkOption...) is not applicable (cannot infer type-variable(s) A (argument mismatch; File cannot be converted to Path))
हुली

1
@ हुली कोई चिंता नहीं, दोस्त! इस तर्क को आजमाएंhttp://www.how-to/java/file-creation-date.html
सुकरात

1
फ़ाइल निर्माण तिथि JDK 8 (कम से कम) पर उपलब्ध नहीं है क्योंकि statxनए लिनक्स कर्नेल संस्करण में syscall जोड़ा गया था।
सेंटअनतारियो

15

मैंने इस कोड के साथ JDK 7 का उपयोग करके इस समस्या को हल किया है:

package FileCreationDate;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Main
{
    public static void main(String[] args) {

        File file = new File("c:\\1.txt");
        Path filePath = file.toPath();

        BasicFileAttributes attributes = null;
        try
        {
            attributes =
                    Files.readAttributes(filePath, BasicFileAttributes.class);
        }
        catch (IOException exception)
        {
            System.out.println("Exception handled when trying to get file " +
                    "attributes: " + exception.getMessage());
        }
        long milliseconds = attributes.creationTime().to(TimeUnit.MILLISECONDS);
        if((milliseconds > Long.MIN_VALUE) && (milliseconds < Long.MAX_VALUE))
        {
            Date creationDate =
                    new Date(attributes.creationTime().to(TimeUnit.MILLISECONDS));

            System.out.println("File " + filePath.toString() + " created " +
                    creationDate.getDate() + "/" +
                    (creationDate.getMonth() + 1) + "/" +
                    (creationDate.getYear() + 1900));
        }
    }
}

13

इस प्रश्न के अनुवर्ती के रूप में - चूंकि यह विशेष रूप से निर्माण समय से संबंधित है और नए nio वर्गों के माध्यम से इसे प्राप्त करने पर चर्चा करता है - यह अभी JDK7 के कार्यान्वयन में लगता है जो आप भाग्य से बाहर हैं। परिशिष्ट: OpenJDK7 में समान व्यवहार है।

यूनिक्स फाइलसिस्टम पर आप निर्माण टाइमस्टैम्प को पुनः प्राप्त नहीं कर सकते हैं, आपको बस अंतिम संशोधन समय की एक प्रति मिलती है। इतना दुखद, लेकिन दुर्भाग्यपूर्ण सच है। मुझे यकीन नहीं है कि ऐसा क्यों है, लेकिन कोड विशेष रूप से ऐसा करता है कि निम्नलिखित प्रदर्शित करेगा।

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;

public class TestFA {
  static void getAttributes(String pathStr) throws IOException {
    Path p = Paths.get(pathStr);
    BasicFileAttributes view
       = Files.getFileAttributeView(p, BasicFileAttributeView.class)
              .readAttributes();
    System.out.println(view.creationTime()+" is the same as "+view.lastModifiedTime());
  }
  public static void main(String[] args) throws IOException {
    for (String s : args) {
        getAttributes(s);
    }
  }
}

1
क्या आप जानते हैं कि इसे एंड्रॉइड के लिए कैसे करना है? BasicFileAttributes उपलब्ध नहीं है जैसा कि वहाँ एपीआई में बनाया गया है ...
android डेवलपर

यह वास्तव में सच है, यहां तक ​​कि एक फोन भी statकाम नहीं करता है। जब तक आप एक कर्नेल को 4.11 से अधिक चलाने के लिए नहीं होते हैं, 2.28 से अधिक glibc, और 8.31 से अधिक कोरुटिल, तब जन्म कीstat रिपोर्ट करेगा तक फ़ाइल की । संबंधित उत्तर देखें unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… वर्तमान में JDK स्टेटस सिस्कल का उपयोग नहीं करता है।
ब्राइस

12

कक्षा Javaका उपयोग करके फ़ाइल की निर्माण तिथि प्राप्त करने का यह एक बुनियादी उदाहरण है BasicFileAttributes:

   Path path = Paths.get("C:\\Users\\jorgesys\\workspaceJava\\myfile.txt");
    BasicFileAttributes attr;
    try {
    attr = Files.readAttributes(path, BasicFileAttributes.class);
    System.out.println("Creation date: " + attr.creationTime());
    //System.out.println("Last access date: " + attr.lastAccessTime());
    //System.out.println("Last modified date: " + attr.lastModifiedTime());
    } catch (IOException e) {
    System.out.println("oops error! " + e.getMessage());
}

इस वर्ग का उपयोग करने की चाहत रखने वाले लोगों को यह ध्यान देना चाहिए कि जावा 1.7 में इसकी शिपिंग शुरू हुई।
jwj

9

java.io.Fileकेवल एपीआई अंतिम प्राप्त करने का समर्थन करता है संशोधित समय । और इंटरनेट इस विषय पर बहुत शांत है।

जब तक मैं कुछ महत्वपूर्ण याद नहीं करता, तब तक जावा पुस्तकालय (जैसा कि अभी तक जावा 7 को शामिल नहीं किया गया है) में यह क्षमता शामिल नहीं है। इसलिए यदि आप इसके लिए बेताब थे, तो एक उपाय यह होगा कि आप सिस्टम रूटीन को कॉल करने के लिए कुछ C (++) कोड लिखें और JNI का उपयोग करके इसे कॉल करें। यह काम जेएनए नामक एक पुस्तकालय में आपके लिए पहले से ही किया जा रहा है , हालांकि।

आपको इसके लिए जावा में अभी भी थोड़ा ओएस विशिष्ट कोडिंग करने की आवश्यकता हो सकती है, हालांकि, जैसा कि आप शायद विंडोज और यूनिक्स / लिनक्स / बीएसडी / ओएस एक्स में उपलब्ध समान सिस्टम कॉल नहीं पाएंगे।


2
हाँ, जावा 7 बहुत अच्छा होगा क्योंकि nio को बुनियादी विशेषताओं में यह प्रतीत होता है। कभी नहीं सोचा था कि मैं बहुत जल्दी पैदा होने के बारे में शिकायत करूंगा! ;)
टोड

6
Fileकक्षा में यह क्षमता नहीं होने का कारण यह है कि अधिकांश फाइल सिस्टम इस जानकारी को ट्रैक भी नहीं करते हैं। और जो लोग हमेशा उस पर सहमत नहीं होते हैं जब इसे अपडेट किया जाना चाहिए।
Syntactic

@ सिंथेट्रिक: वास्तव में अधिकांश फाइलसिस्टम इस जानकारी को ट्रैक करते हैं । अपवादों में ext <= 3 और Reiser शामिल हैं। FAT, NTFS, HFS, ZFS और ext4 इसका समर्थन करते हैं। लेकिन लिनक्स की सभी परतों और पुस्तकालयों और आदेशों के माध्यम से इसे सार्वभौमिक रूप से उपयोग करने के लिए प्रचार करना धीमा हो गया है।
हिप्पिट्रैएल

@Carl linux में, मैं जावा NIO का उपयोग करते हुए संशोधन और निर्माण तिथि प्राप्त कर रहा हूं। क्या यह सामान्य व्यवहार है?
जयेश ढांडा

@ ज्येष्ठधन्धा, यदि फ़ाइल बनने के बाद कुछ भी संशोधित नहीं होता है, तो मैं सृजन और संशोधन के समय के बराबर होने की उम्मीद करूंगा । आप touchमॉड समय को बदलने और फिर से जाँच करने का उपयोग करके इसे बदलने की कोशिश कर सकते हैं ।
कार्ल स्मोट्रिकज़

9

एक विंडोज सिस्टम पर, आप मुफ्त फ़ाइलटाइम्स लाइब्रेरी का उपयोग कर सकते हैं ।

यह भविष्य में जावा NIO.2 (JDK 7) और java.nio.file.attribute पैकेज के साथ आसान हो जाएगा ।

लेकिन याद रखें कि अधिकांश लिनक्स फाइल सिस्टम फाइल निर्माण टाइमस्टैम्प का समर्थन नहीं करते हैं


लिनक्स मशीनों के लिए कोई अन्य तरीका जो निर्मित समय का समर्थन नहीं करता है?
मैवरिक

बस एक फ़ाइल सिस्टम का उपयोग करें जो फ़ाइल निर्माण टाइमस्टैम्प का समर्थन करता है। जुड़ा हुआ विकिपीडिया लेख ext4 बताता है जो अब काफी सामान्य है।
दावतोम

1

java1.7 + में आप इस कोड का इस्तेमाल फाइल बनाने के लिए कर सकते हैं!

private static LocalDateTime getCreateTime(File file) throws IOException {
        Path path = Paths.get(file.getPath());
        BasicFileAttributeView basicfile = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
        BasicFileAttributes attr = basicfile.readAttributes();
        long date = attr.creationTime().toMillis();
        Instant instant = Instant.ofEpochMilli(date);
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

क्या आप इस बारे में विस्तार से बता सकते हैं कि हमें इस ऊधम की आवश्यकता क्यों है Instant.ofEpochMilli(date)। धन्यवाद
किरिल Karmazin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.