আমাকে একটি ডিরেক্টরিতে সর্বাধিক সংশোধিত ফাইল সন্ধান করতে হবে।
আমি জানি যে আমি একটি ফোল্ডারে প্রতিটি ফাইল লুপ করতে পারি এবং তুলনা File.GetLastWriteTime
করতে পারি, তবে লুপ না করে কী আরও ভাল উপায় আছে ?.
আমাকে একটি ডিরেক্টরিতে সর্বাধিক সংশোধিত ফাইল সন্ধান করতে হবে।
আমি জানি যে আমি একটি ফোল্ডারে প্রতিটি ফাইল লুপ করতে পারি এবং তুলনা File.GetLastWriteTime
করতে পারি, তবে লুপ না করে কী আরও ভাল উপায় আছে ?.
উত্তর:
কিভাবে ভালো কিছু সম্পর্কে...
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();
directory.GetFiles().OrderByDescending(f => f.LastWriteTime).First()
FirstOrDefault()
পরিবর্তে এই ব্যবহার করা উচিত নয় First()
? InvalidOperationException
ডিরেক্টরিটি খালি থাকলে পরবর্তীটির কারণে এটি ঘটবে ।
আপনি যদি পুনরাবৃত্তি অনুসন্ধান করতে চান, আপনি কোডের এই সুন্দর অংশটি ব্যবহার করতে পারেন:
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
ডিরেক্টরি খালি থাকলে ফেরত দেয় ।
উপরের প্রথমটির উপর প্রসারিত, আপনি যদি কোনও নির্দিষ্ট প্যাটার্নটি অনুসন্ধান করতে চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:
string pattern = "*.txt";
var dirInfo = new DirectoryInfo(directory);
var file = (from f in dirInfo.GetFiles(pattern) orderby f.LastWriteTime descending select f).First();
একটি নন-লিনকিউ সংস্করণ:
/// <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;
}
কিছুটা দেরি হলেও ...
আপনার কোড কাজ করবে না, কারণ 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;
}
ধন্যবাদ
আপনার সাথে নতুন ফাইল কার্যকলাপ বিক্রিয়া ঘটাতে পারে FileSystemWatcher ।
এখানে একটি সংস্করণ যা প্রতিটি উপ-ডিরেক্টরি থেকে সর্বাধিক সাম্প্রতিক ফাইল পায়
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));
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;
}
আমি এটি করি আমার অ্যাপগুলির একটি গুচ্ছ এবং আমি এই জাতীয় বিবৃতি ব্যবহার করি:
var inputDirectory = new DirectoryInfo("\\Directory_Path_here");
var myFile = inputDirectory.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
এখান থেকে আপনার কাছে "ইনপুট ডিরেক্টরি" ভেরিয়েবলের ডিরেক্টরিতে সর্বাধিক সংরক্ষিত / যুক্ত / আপডেট হওয়া ফাইলের ফাইল নাম থাকবে। এখন আপনি এটি অ্যাক্সেস করতে পারেন এবং এটি দিয়ে যা চান তা করতে পারেন।
আশা করি এইটি কাজ করবে.