मुझे एक निर्देशिका में सबसे हाल ही में संशोधित फ़ाइल खोजने की आवश्यकता है।
मुझे पता है कि मैं एक फ़ोल्डर में हर फ़ाइल के माध्यम से लूप कर सकता हूं और तुलना कर सकता हूं 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();
एक गैर LINQ संस्करण:
/// <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);इसलिए NullReference अपवाद को फेंक दिया जाएगा। कार्य संस्करण होना चाहिए:
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();
यहां से आपको "inputDirectory" चर की निर्देशिका में सबसे हाल ही में सहेजी गई / जोड़ी गई / अपडेट की गई फ़ाइल का नाम होगा। अब आप इसे एक्सेस कर सकते हैं और वही कर सकते हैं जो आप इसके साथ चाहते हैं।
उम्मीद है की वो मदद करदे।