.NET ব্যবহার করে এবং লুপ ছাড়াই কোনও ডিরেক্টরিতে সর্বাধিক সাম্প্রতিক ফাইলটি কীভাবে সন্ধান করবেন?


142

আমাকে একটি ডিরেক্টরিতে সর্বাধিক সংশোধিত ফাইল সন্ধান করতে হবে।

আমি জানি যে আমি একটি ফোল্ডারে প্রতিটি ফাইল লুপ করতে পারি এবং তুলনা File.GetLastWriteTimeকরতে পারি, তবে লুপ না করে কী আরও ভাল উপায় আছে ?.


18
না এর চেয়ে ভাল উপায় আর নেই যা লুপিং এড়ায়। এমনকি লিনকিউ ব্যবহার করা লুপিংকে কিছু গভীর কার্যকারিতার মধ্যে লুকিয়ে রাখে যেখানে আপনি এটি সরাসরি দেখতে পাচ্ছেন না।
অলিভার

1
আপনি যদি পুরো ফাইল সিস্টেমে সর্বাধিক সংশোধিত ফাইল (গুলি) সন্ধান করতে চান তবে এনটিএফএস চেঞ্জ জার্নাল কার্যকর হবে। যদিও সি # থেকে ব্যবহার করা খুব কঠিন।
বেন ভয়েগট

উত্তর:


318

কিভাবে ভালো কিছু সম্পর্কে...

var directory = new DirectoryInfo("C:\\MyDirectory");
var myFile = (from f in directory.GetFiles()
             orderby f.LastWriteTime descending
             select f).First();

// or...
var myFile = directory.GetFiles()
             .OrderByDescending(f => f.LastWriteTime)
             .First();

84
ব্যক্তিগতভাবে, আমি দেখতে পেয়েছি যে চিনিবিহীন সংস্করণটি পড়া সহজ:directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()
জার্ন শো-রোড

6
হ্যাঁ, আমি বেশিরভাগ সময়ও একমত হই - তবে উদাহরণ দেওয়ার সময় কোয়েরি সিনট্যাক্সটি এটি আরও একটি স্পষ্ট করে তোলে যে এটি একটি লিনক কোয়েরি। আমি উভয় বিকল্পের সাথে উদাহরণটি আপডেট করব rif
স্কট আইভে

3
ধন্যবাদ! এখন আমাকে আমার
নেটকে

3
আপনি কিছুটা অতিরিক্ত কাজ করে 2.0 এসপি 1 দিয়ে লিনাক ব্যবহার করতে পারেন - কেবলমাত্র 3.5. থেকে সিস্টেম.কোর.ডিল ফাইলটি উল্লেখ করুন এবং এটি "স্থানীয় অনুলিপি" তে সেট করুন
স্কট আইভে

8
FirstOrDefault()পরিবর্তে এই ব্যবহার করা উচিত নয় First()? InvalidOperationExceptionডিরেক্টরিটি খালি থাকলে পরবর্তীটির কারণে এটি ঘটবে ।
টোবিয়াস জে

20

আপনি যদি পুনরাবৃত্তি অনুসন্ধান করতে চান, আপনি কোডের এই সুন্দর অংশটি ব্যবহার করতে পারেন:

public static FileInfo GetNewestFile(DirectoryInfo directory) {
   return directory.GetFiles()
       .Union(directory.GetDirectories().Select(d => GetNewestFile(d)))
       .OrderByDescending(f => (f == null ? DateTime.MinValue : f.LastWriteTime))
       .FirstOrDefault();                        
}

এটিকে কেবল নিম্নলিখিত পদ্ধতিতে কল করুন:

FileInfo newestFile = GetNewestFile(new DirectoryInfo(@"C:\directory\"));

এবং এটাই. একটি FileInfoদস্তাবেজ বা nullডিরেক্টরি খালি থাকলে ফেরত দেয় ।


12
অথবা আপনি পুনরাবৃত্তি অনুসন্ধান বিকল্পটি ব্যবহার করতে পারেন ।
রিক্সেট

17

উপরের প্রথমটির উপর প্রসারিত, আপনি যদি কোনও নির্দিষ্ট প্যাটার্নটি অনুসন্ধান করতে চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();

আমার ওটা দরকার ছিল. ধন্যবাদ.
আশিলন

10

একটি নন-লিনকিউ সংস্করণ:

/// <summary>
/// Returns latest writen file from the specified directory.
/// If the directory does not exist or doesn't contain any file, DateTime.MinValue is returned.
/// </summary>
/// <param name="directoryInfo">Path of the directory that needs to be scanned</param>
/// <returns></returns>
private static DateTime GetLatestWriteTimeFromFileInDirectory(DirectoryInfo directoryInfo)
{
    if (directoryInfo == null || !directoryInfo.Exists)
        return DateTime.MinValue;

    FileInfo[] files = directoryInfo.GetFiles();
    DateTime lastWrite = DateTime.MinValue;

    foreach (FileInfo file in files)
    {
        if (file.LastWriteTime > lastWrite)
        {
            lastWrite = file.LastWriteTime;
        }
    }

    return lastWrite;
}

/// <summary>
/// Returns file's latest writen timestamp from the specified directory.
/// If the directory does not exist or doesn't contain any file, null is returned.
/// </summary>
/// <param name="directoryInfo">Path of the directory that needs to be scanned</param>
/// <returns></returns>
private static FileInfo GetLatestWritenFileFileInDirectory(DirectoryInfo directoryInfo)
{
    if (directoryInfo == null || !directoryInfo.Exists)
        return null;

    FileInfo[] files = directoryInfo.GetFiles();
    DateTime lastWrite = DateTime.MinValue;
    FileInfo lastWritenFile = null;

    foreach (FileInfo file in files)
    {
        if (file.LastWriteTime > lastWrite)
        {
            lastWrite = file.LastWriteTime;
            lastWritenFile = file;
        }
    }
    return lastWritenFile;
}

1
দুঃখিত, আপনি লুপ করতে চান নি এই সত্যটি দেখেন নি। যাইহোক ... সম্ভবত এটি কাউকে অনুরূপ কিছু অনুসন্ধান করতে সহায়তা করবে
তীমথিয়

3
এই কোডটি সংকলন করে না। - সর্বশেষ আপডেটেড ফাইলটি অ্যারে হওয়া উচিত নয়। - সর্বশেষে আপডেটের প্রাথমিক মানটি অবৈধ (0001/0/0)।
লার্স এ। ব্রেকেকেন

4

সংক্ষিপ্ত এবং সাধারণ :

new DirectoryInfo(path).GetFiles().OrderByDescending(o => o.LastWriteTime).FirstOrDefault();

3

কিছুটা দেরি হলেও ...

আপনার কোড কাজ করবে না, কারণ list<FileInfo> lastUpdateFile = null; এবং পরে lastUpdatedFile.Add(file);নালরফেরেন্স ব্যতিক্রম নিক্ষেপ করা হবে। কাজের সংস্করণটি হওয়া উচিত:

private List<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo)
{
    FileInfo[] files = directoryInfo.GetFiles();
    List<FileInfo> lastUpdatedFile = new List<FileInfo>();
    DateTime lastUpdate = DateTime.MinValue;
    foreach (FileInfo file in files)
    {
        if (file.LastAccessTime > lastUpdate)
        {
            lastUpdatedFile.Add(file);
            lastUpdate = file.LastAccessTime;
        }
    }

    return lastUpdatedFile;
}

ধন্যবাদ


2

আপনার সাথে নতুন ফাইল কার্যকলাপ বিক্রিয়া ঘটাতে পারে FileSystemWatcher


1
এটি কাজ করে না কারণ তার অ্যাপ্লিকেশনটি চলমান না থাকলে কোনও ফাইল সংশোধন করা যেতে পারে।
ফ্রান্সিস বি।

1
তিনি এই ধরণের বিশদটি দেন নি ... আমরা কীভাবে জানব যে এটি একটি দৃ pers় অ্যাপ্লিকেশন নয়?
স্কট মার্লো

1
আমরা তা করি না, তবে স্কট উভয়ের ক্ষেত্রেই কী কার্যকর তা আরও ভাল সমাধান রয়েছে।
বাদারো

এছাড়াও, নোট করুন যে এফএসডাব্লু বেশিরভাগ নেটওয়ার্ক শেয়ার করা ফোল্ডারগুলির সাথে কাজ করবে না।
বিকেকিসি

2

আপনি যদি ব্যবহার করছেন Directory.EnumerateFilesএবং সর্বশেষে সর্বশেষে সংশোধিত ফাইলগুলি পড়তে চান তবে অন্য পদ্ধতি approach

foreach (string file in Directory.EnumerateFiles(fileDirectory, fileType).OrderByDescending(f => new FileInfo(f).LastWriteTime))

}

1

এখানে একটি সংস্করণ যা প্রতিটি উপ-ডিরেক্টরি থেকে সর্বাধিক সাম্প্রতিক ফাইল পায়

List<string> reports = new List<string>();    
DirectoryInfo directory = new DirectoryInfo(ReportsRoot);
directory.GetFiles("*.xlsx", SearchOption.AllDirectories).GroupBy(fl => fl.DirectoryName)
.ForEach(g => reports.Add(g.OrderByDescending(fi => fi.LastWriteTime).First().FullName));

0
private List<FileInfo> GetLastUpdatedFileInDirectory(DirectoryInfo directoryInfo)
{
    FileInfo[] files = directoryInfo.GetFiles();
    List<FileInfo> lastUpdatedFile = null;
    DateTime lastUpdate = new DateTime(1, 0, 0);
    foreach (FileInfo file in files)
    {
        if (file.LastAccessTime > lastUpdate)
        {
            lastUpdatedFile.Add(file);
            lastUpdate = file.LastAccessTime;
        }
    }

    return lastUpdatedFile;
}

0

আমি এটি করি আমার অ্যাপগুলির একটি গুচ্ছ এবং আমি এই জাতীয় বিবৃতি ব্যবহার করি:

  var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
  var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();

এখান থেকে আপনার কাছে "ইনপুট ডিরেক্টরি" ভেরিয়েবলের ডিরেক্টরিতে সর্বাধিক সংরক্ষিত / যুক্ত / আপডেট হওয়া ফাইলের ফাইল নাম থাকবে। এখন আপনি এটি অ্যাক্সেস করতে পারেন এবং এটি দিয়ে যা চান তা করতে পারেন।

আশা করি এইটি কাজ করবে.


এটি যোগ করার জন্য, যদি আপনার লক্ষ্য ফাইলের পথটি ফিরে পাওয়া হয় এবং আপনি ফার্স্টআরডিফল্ট ব্যবহার করছেন কারণ এটির কোনও ফলাফলের সম্ভাবনা রয়েছে তবে আপনি ফুলনেম সম্পত্তিটিতে নাল-শর্তসাপেক্ষ অপারেটরটি ব্যবহার করতে পারেন। এটি আপনাকে পূর্ননাম বলার আগে ফার্স্টঅরডেফল্ট থেকে ফাইলআইএনফো না বাঁচিয়ে আপনার পথে "নাল" ফিরিয়ে দেবে। স্ট্রিং পাথ = নতুন ডিরেক্টরিআইএনফো (পাথ) etGetFiles ()। অর্ডারবাইডিজেন্ডিং (o => o.LastWritTime) Fফার্সঅর্ডার ডিফল্ট ()? পুরো নাম;
স্টলেফিশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.