জাভাতে ফাইল তৈরির তারিখ নির্ধারণ করুন


102

স্ট্যাকওভারফ্লোতে আমার আরও একটি অনুরূপ প্রশ্ন রয়েছে ( জাভাতে কোনও ফাইলের সৃষ্টির তারিখ কীভাবে পাওয়া যায় ) তবে উত্তরটির সত্যতা সেখানে নেই কারণ অন্যান্য পদ্ধতির মাধ্যমে সমাধান করা যায় ওপির একটি আলাদা প্রয়োজন ছিল। বয়সের অনুসারে বাছাই করা যায় এমন ডিরেক্টরিতে ফাইলগুলির একটি তালিকা তৈরি করার চেষ্টা করছি তাই ফাইল তৈরির তারিখের প্রয়োজন।

ওয়েবে অনেক ট্রলিংয়ের পরে এটি করার জন্য আমি কোনও ভাল উপায় খুঁজে পাইনি। ফাইল তৈরির তারিখ পাওয়ার জন্য কি কোনও ব্যবস্থা আছে?

বিটিডাব্লু, বর্তমানে উইন্ডোজ সিস্টেমে লিনাক্স সিস্টেমে কাজ করার জন্য এটির প্রয়োজন হতে পারে। এছাড়াও, আমি গ্যারান্টি দিতে পারি না যে কোনও ফাইলের নামকরণের কনভেনশন অনুসরণ করা হবে যেখানে নাম তৈরির তারিখ / সময় এম্বেড করা আছে।


2
ঠিক আছে, ফাইল সিস্টেমগুলিতে আরও আলোচনা এবং তদন্তের পরে, আমরা সিদ্ধান্ত নিয়েছি যে শেষ বার সংশোধিত ব্যবহার করা যথেষ্ট কারণ এটি সম্ভবত তৈরির তারিখের সাথে পরীক্ষা করে দেখতে হবে। কোনও পুরানো ফাইল সম্প্রতি সংশোধিত হয়েছে এবং তাই এখনও সক্রিয় রয়েছে কিনা তা নির্ধারণের জন্য উভয়েরই পরীক্ষা করা প্রয়োজন। অতএব, কেবল অতীতে ফাইলটি সংশোধন করে দেখুন। সমস্ত ইনপুট জন্য ধন্যবাদ। বিটিডাব্লু, আমি নিও ব্যবহার করতে পছন্দ করব তবে লিনাক্সের স্বাদ এখানে যাইহোক ফাইল তৈরি সমর্থন করে না।
টড

উত্তর:


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. We আমরা এখনও using ব্যবহার করছি তবে আমি আমাদের আপগ্রেড বিকল্পগুলি তদন্ত করব।
টড

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))
Hooli

1
@ হুলির কোন উদ্বেগ নেই, সাথী! এই লজিকবিগ . com/how-to/java/file-creation-date.html চেষ্টা করুন ।
সক্রেটিস

1
statxসিস্কাল নতুন লিনাক্স কার্নেল সংস্করণে যুক্ত হওয়ায় ফাইল তৈরির তারিখটি জেডিকে 8 তে অন্তত উপলব্ধ নয় available
সেন্ট অ্যান্টারিও

15

আমি এই কোডটি দিয়ে জেডিকে 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

এই প্রশ্নের অনুগামী হিসাবে - যেহেতু এটি বিশেষত সৃষ্টির সময়ের সাথে সম্পর্কিত এবং নতুন নিও ক্লাসগুলির মাধ্যমে এটি অর্জনের বিষয়ে আলোচনা করে - জেডকে K এর বাস্তবায়নে এখনই মনে হয় আপনি ভাগ্য থেকে দূরে রয়েছেন। সংযোজন: একই আচরণ ওপেনজেডকে in এ।

ইউনিক্স ফাইল সিস্টেমে আপনি তৈরির টাইমস্ট্যাম্প পুনরুদ্ধার করতে পারবেন না, আপনি কেবল সর্বশেষ পরিবর্তনের সময়ের একটি অনুলিপি পাবেন। দুঃখজনক হলেও দুর্ভাগ্যজনকভাবে সত্য। আমি কেন তা নিশ্চিত নই তবে কোডটি বিশেষত এটি করে যা নিম্নলিখিত হিসাবে প্রদর্শিত হবে।

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 সেখানে API হিসাবে নির্মিত হিসাবে উপলব্ধ নেই ...
অ্যান্ড্রয়েড বিকাশকারী

এটি প্রকৃতপক্ষে সত্য, এমনকি একটি কলও statকাজ করে না। আপনি যদি 4.11-র চেয়ে বেশি গ্লোব্যাকের সাথে 2.28 এর চেয়ে বেশি কার্নেল এবং 8.31 এর চেয়ে বেশি কোর্টিলগুলি চালিত না করেন তবে ফাইলটির জন্মের বিষয়ে statরিপোর্ট করা হবে । সম্পর্কিত উত্তর দেখুন unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/… বর্তমানে জেডিকে স্ট্যাটাক্স সিস্কেল ব্যবহার করে না।
ব্রাইস

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());
}

এই শ্রেণিটি ব্যবহার করার জন্য অনুসন্ধান করা লোকদের লক্ষ্য করা উচিত যে এটি জাভা ১.7 এ শিপিং শুরু করেছে।
jwj

9

java.io.Fileকেবলমাত্র এপিআই সর্বশেষ পরিবর্তিত সময় পাওয়ার জন্য সমর্থন করে । এবং ইন্টারনেটও এই বিষয়ে খুব শান্ত আছে।

যতক্ষণ না আমি উল্লেখযোগ্য কিছু মিস করি, জাভা গ্রন্থাগারটি যেমন (এখনও পর্যন্ত জাভা 7 অন্তর্ভুক্ত নয়) এই ক্ষমতাটি অন্তর্ভুক্ত করে না। সুতরাং আপনি যদি এর জন্য মরিয়া হয়ে থাকেন তবে একটি সমাধান হ'ল সিস্টেমের রুটিনগুলি কল করতে জেএনআই ব্যবহার করে কিছু সি (++) কোড লিখুন। যদিও এই কাজটি বেশিরভাগই আপনার জন্য জেএনএ নামে একটি লাইব্রেরিতে ইতিমধ্যে সম্পন্ন হয়েছে ।

এর জন্য আপনার জাভাতে কিছুটা ওএস নির্দিষ্ট কোডিং করার দরকার হতে পারে, যদিও আপনি সম্ভবত উইন্ডোজ এবং ইউনিক্স / লিনাক্স / বিএসডি / ওএস এক্স-তে একই সিস্টেম কল উপলব্ধ পাবেন না not


2
হ্যাঁ, জাভা 7 দুর্দান্ত হবে কারণ নিওটিকে এটি প্রাথমিক বৈশিষ্ট্যের সাথে দেখা যায়। কখনও ভাবিনি যে আমি খুব তাড়াতাড়ি জন্মের বিষয়ে অভিযোগ করব! ;)
টড

6
Fileশ্রেণীর এই ক্ষমতা না থাকার কারণটি হ'ল বেশিরভাগ ফাইল সিস্টেমগুলি এই তথ্যও ট্র্যাক করে না। এবং যেগুলি সর্বদা একমত হয় না যখন এটি আপডেট করা উচিত।
সিনট্যাকটিক

@ সিনট্যাকটিক: আসলে বেশিরভাগ ফাইল সিস্টেমগুলি এই তথ্যটিকে ট্র্যাক করে । ব্যতিক্রমগুলির মধ্যে ext <= 3 এবং রিজার অন্তর্ভুক্ত। এফএটি, এনটিএফএস, এইচএফএস, জেডএফএস, এবং ext4 এটিকে সমর্থন করে। তবে এটি সর্বজনীনভাবে ব্যবহারের জন্য লিনাক্সের সমস্ত স্তর এবং গ্রন্থাগার এবং কমান্ডের মাধ্যমে প্রচার করতে ধীর হয়ে গেছে।
হিপ্পিট্রেইল

@ কার্ল লিনাক্সে, আমি জাভা এনআইও ব্যবহার করার সময় পরিবর্তন এবং তৈরির তারিখ একই পেয়ে যাচ্ছি। এটা কি স্বাভাবিক আচরণ?
জয়েশ ধন্ধা

@ জয়েশধন্ধা, ফাইলটি তৈরির পরে যদি কোনও কিছু পরিবর্তন না করে তবে আমি আশা করব সৃষ্টির এবং পরিবর্তনের সময়গুলি সমান হবে। 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)। ধন্যবাদ
কিরিল কারমাজিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.