.NET ব্যবহার করে একটি ডিরেক্টরিতে 3 মাসের পুরানো ফাইলগুলি মুছুন


117

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

কেবল পরিষ্কার করে বলা: আমি 90 দিনের চেয়ে পুরানো ফাইলগুলি সন্ধান করছি, অন্য কথায় 90 দিনেরও কম সময়ের আগে তৈরি করা ফাইলগুলি রাখা উচিত, অন্য সমস্ত মুছে ফেলা উচিত।


যদি ফাইলগুলির একটি গুরুত্বপূর্ণ পরিমাণ থাকে, তবে সর্বোত্তম হ'ল getFiles এবং GetD निर्देशिकाগুলির পরিবর্তে EnumerateFiles এবং EnumerateD ডিরেক্টরীগুলি ব্যবহার করা, কারণ তারা তালিকা সংগ্রহের পরিবর্তে সরাসরি গণনা চালায়। তবে আপনাকে ফোরচ লুপ ব্যবহার করতে হবে।
ল্যারি

উত্তর:


257

এই মত কিছু এটি করতে।

using System.IO; 

string[] files = Directory.GetFiles(dirName);

foreach (string file in files)
{
   FileInfo fi = new FileInfo(file);
   if (fi.LastAccessTime < DateTime.Now.AddMonths(-3))
      fi.Delete();
}

ধন্যবাদ, আমি লক্ষ্য করেছি আপনি শেষঅ্যাক্সেসটাইম ব্যবহার করছেন, এটি কি তৈরির সময়?
জেএল।

10
না, হিসাবে সম্পত্তি হিসাবে নামগুলি বলেছেন: LastAccessTime- CreationTimeআপনি চাইলে সম্পত্তি হিসাবে যাওয়া উচিত !
Andreas Niedermair

4
হ্যাঁ, আপনি কোন সম্পত্তি ব্যবহার করবেন তা সম্পূর্ণরূপে আপনার। আপনি চাইলে লাস্ট রাইটটাইমও ব্যবহার করতে পারেন।
স্টিভ ড্যানার

3
আমাকে সাহায্য করার জন্য +1। একটি নতুন ফাইল-ইনফো উদাহরণ তৈরি করার পরিবর্তে আপনি ফাইল.গেটক্রিয়েশনটাইম বা ফাইল.গেটলাস্টঅ্যাকসেসটাইম ব্যবহার করতে পারেন। গৌণ পারফরম্যান্সের উন্নতি হওয়া উচিত।
মারিও দ্য চামচ

5
আমি অনুমান করি গেটফিলস এবং মুছুন আপনার পরিবেশে কখনই ব্যর্থ হয়? কেবল এটি উল্লেখ করা যেহেতু এটি একটি অত্যন্ত রেফারেন্সযুক্ত উত্তর বলে মনে হচ্ছে।
অ্যান্ড্রু হাগনার

93

এখানে একটি 1-লাইনার ল্যাম্বদা রয়েছে:

Directory.GetFiles(dirName)
         .Select(f => new FileInfo(f))
         .Where(f => f.LastAccessTime < DateTime.Now.AddMonths(-3))
         .ToList()
         .ForEach(f => f.Delete());

@ ভ্ল্যাডএল আমি টোলিস্ট () বাদ দিলে আমি একটি "আইনিম্যুয়াল <ফাইল ফাইলস> ফোরইচ ধারণ করে না" পেতে পারি। আমি কেবল এটি রেখেছি
জেমস লাভ

3
আমি এই পছন্দ। তবে আমি মুছে ফেলতে চেষ্টা করে / ধরাতে চাই
H20rider

new DirectoryInfo(dir).GetFiles()new FileInfo(f)প্রতিটি একক ফাইলের চেয়ে দ্রুত ।
ভোজটাচ দোহনাল

29

যারা লিনকিউ অতিরিক্ত ব্যবহার করতে চান তাদের জন্য।

(from f in new DirectoryInfo("C:/Temp").GetFiles()
 where f.CreationTime < DateTime.Now.Subtract(TimeSpan.FromDays(90))
 select f
).ToList()
    .ForEach(f => f.Delete());

1
var ফাইলসটিলিট = নতুন ডিরেক্টরি ইন্ফো (@ "সি: \ টেম্প") Get // প্রকরণ
Ta01

2
Woho! আমার চেয়ে অন্য কেউ ভাবেন যে লিনকিউ অতিরিক্ত ব্যবহার করা দুর্দান্ত! ;)
ফিলিপ একবার্গ

.ToList()ম্যাচ করা ফাইলগুলির মাধ্যমে কলটি একটি দ্বিতীয় লুপ ছাড়া আর কী যুক্ত করে ?
জোয়েল মুলার 21

2
@ জোয়েল মুয়েলার List<T>একটি ForEachপদ্ধতি নির্ধারণ করে যা Action<T>সমস্ত উপাদানগুলিতে প্রয়োগ করতে ব্যবহৃত হতে পারে । দুর্ভাগ্যক্রমে এর জন্য এমন কোনও এক্সটেনশন পদ্ধতি নেই IEnumerable<T>
স্যামুয়েল নেফ

1
ভাল যুক্তি. আমি আমার নিজের লিখেছিলেন ForEachজন্য এক্সটেনশন পদ্ধতি IEnumerable<T>কিছু দিন আগেও আমি কখনও কখনও ভুলবেন এতে নির্মিত না হয়।
জোএল মুলার

14

ডিরেক্টরিতে ফাইল তৈরির সময় কীভাবে পাওয়া যায় এবং 3 মাস আগে (90 দিন আগে সঠিক হওয়ার জন্য) যেগুলি তৈরি করা হয়েছিল সেগুলি কীভাবে পাবেন তার স্নিপেট এখানে রয়েছে:

    DirectoryInfo source = new DirectoryInfo(sourceDirectoryPath);

    // Get info of each file into the directory
    foreach (FileInfo fi in source.GetFiles())
    {
        var creationTime = fi.CreationTime;

        if(creationTime < (DateTime.Now- new TimeSpan(90, 0, 0, 0)))
        {
            fi.Delete();
        }
    }

দরকার নেই ToList(), DirectoryInfo.GetFiles()ফেরত দেয় a FileInfo[]
ডায়নামি লে সাভার্ড

4
foreach()এর মান ধরে রাখতে আপনার লুপের বাইরে একটি নতুন ভেরিয়েবল ঘোষণা করা উচিত (DateTime.Now- new TimeSpan(90, 0, 0, 0))। লুপটিতে বারবার এটি গণনা করার কোনও কারণ নেই।
চাদ


1

মূলত আপনি সমস্ত ফাইলের একটি তালিকা পেতে ডিরেক্টরি.গেটফাইলস (পাথ) ব্যবহার করতে পারেন। এর পরে আপনি তালিকাটি লুপ করবেন এবং কীথের পরামর্শ অনুসারে getLastAccessTim () কল করুন।



1

আমি এই কোডটি চেষ্টা করে দেখেছি এবং এটি খুব ভালভাবে কাজ করে, আশা করি এর উত্তর এসেছে

namespace EraseJunkFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo yourRootDir = new DirectoryInfo(@"C:\yourdirectory\");
            foreach (FileInfo file in yourRootDir.GetFiles())
                if (file.LastWriteTime < DateTime.Now.AddDays(-90))
                    file.Delete();
        }
    }
}

2
90 দিন <> 3 মাস
ড্যানিয়েল

1

একটি নির্দিষ্ট সময়কালে ফাইলগুলি মুছতে চাওয়ার ক্ষেত্রে সর্বাধিক প্রচলিত পদ্ধতিটি হ'ল ফাইলের লাস্ট রাইটটাইম (শেষ বারের সময় ফাইলটি সংশোধন করা হয়েছিল) ব্যবহার করে:

Directory.GetFiles(dirName)
         .Select(f => new FileInfo(f))
         .Where(f => f.LastWriteTime < DateTime.Now.AddMonths(-3))
         .ToList()
         .ForEach(f => f.Delete());

(উপরের উরির উত্তর উপর ভিত্তি করে কিন্তু সাথে LastWriteTime।)

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

বিকল্পভাবে, খুব অস্বাভাবিক পরিস্থিতিতে আপনি নীচেরটি ব্যবহার করতে পারেন, তবে সাবধানতার সাথে এগুলি ব্যবহার করার সাথে সাথে তারা সাবধানতা অবলম্বন করবেন।

CreationTime
.Where(f => f.CreationTime < DateTime.Now.AddMonths(-3))

বর্তমান অবস্থানটিতে ফাইলটি তৈরি করার সময়। তবে, ফাইলটি অনুলিপি করা হয়েছে কিনা সে বিষয়ে সতর্কতা অবলম্বন করুন, এটি কপি করার সময় হবে এবং ফাইলটির চেয়ে নতুনCreationTime হবে ।LastWriteTime

LastAccessTime
.Where(f => f.LastAccessTime < DateTime.Now.AddMonths(-3))

আপনি যদি শেষবার পড়ার সময় ভিত্তিক ফাইলগুলি মুছতে চান তবে আপনি এটি ব্যবহার করতে পারেন তবে, এনটিএফএসে এটি অক্ষম করা যেতে পারে বলে আপডেট হওয়ার কোনও গ্যারান্টি নেই। fsutil behavior query DisableLastAccessএটি চালু আছে কিনা তা পরীক্ষা করে দেখুন। এছাড়াও এনটিএফএসের অধীনে এটি ফাইলের লাস্টএ্যাক্সেসটাইম অ্যাক্সেস হওয়ার পরে আপডেট হতে এক ঘন্টা সময় নিতে পারে।


0

আপনার কেবল ফাইলআইএনফো দরকার -> ক্রিয়েশনটাইম প্রয়োজন

এবং কেবল সময়ের পার্থক্য গণনা করা।

app.config তোমাকে নিস্তার করিতে পারে TimeSpan বয়স কত ফাইল মুছে ফেলা হবে হওয়া আবশ্যক মান

ডেটটাইম বিয়োগফলও পরীক্ষা করে দেখুন পদ্ধতিও ।

শুভকামনা



0
            system.IO;

             List<string> DeletePath = new List<string>();
            DirectoryInfo info = new DirectoryInfo(Server.MapPath("~\\TempVideos"));
            FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
            foreach (FileInfo file in files)
            {
                DateTime CreationTime = file.CreationTime;
                double days = (DateTime.Now - CreationTime).TotalDays;
                if (days > 7)
                {
                    string delFullPath = file.DirectoryName + "\\" + file.Name;
                    DeletePath.Add(delFullPath);
                }
            }
            foreach (var f in DeletePath)
            {
                if (File.Exists(F))
                {
                    File.Delete(F);
                }
            }

পৃষ্ঠা লোড বা ওয়েবসার্ভিস বা অন্য কোনও ব্যবহারে ব্যবহার করুন।

আমার ধারণাটি স্পষ্ট হয়ে গেছে 7 দিন আমাকে ডিবি ব্যবহার না করে ফোল্ডার ফাইল মুছতে হবে


0
         //Store the number of days after which you want to delete the logs.
         int Days = 30;

          // Storing the path of the directory where the logs are stored.
           String DirPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Substring(6) + "\\Log(s)\\";

          //Fetching all the folders.
            String[] objSubDirectory = Directory.GetDirectories(DirPath);

            //For each folder fetching all the files and matching with date given 
            foreach (String subdir in objSubDirectory)     
            {
                //Getting the path of the folder                 
                String strpath = Path.GetFullPath(subdir);
                //Fetching all the files from the folder.
                String[] strFiles = Directory.GetFiles(strpath);
                foreach (string files in strFiles)
                {
                    //For each file checking the creation date with the current date.
                    FileInfo objFile = new FileInfo(files);
                    if (objFile.CreationTime <= DateTime.Now.AddDays(-Days))
                    {
                        //Delete the file.
                        objFile.Delete();
                    }
                }

                //If folder contains no file then delete the folder also.
                if (Directory.GetFiles(strpath).Length == 0)
                {
                    DirectoryInfo objSubDir = new DirectoryInfo(subdir);
                    //Delete the folder.
                    objSubDir.Delete();
                }

            }

0

উদাহরণস্বরূপ: উত্স অনুসারে আমার ফোল্ডার প্রকল্পে যেতে আমার দুটি ফোল্ডার আপ করতে হবে। আমি এই অ্যালগরিমটি সপ্তাহে 2 দিন এবং চার ঘন্টা তৈরি করি

public static void LimpiarArchivosViejos()
    {
        DayOfWeek today = DateTime.Today.DayOfWeek;
        int hora = DateTime.Now.Hour;
        if(today == DayOfWeek.Monday || today == DayOfWeek.Tuesday && hora < 12 && hora > 8)
        {
            CleanPdfOlds();
            CleanExcelsOlds();
        }

    }
    private static void CleanPdfOlds(){
        string[] files = Directory.GetFiles("../../Users/Maxi/Source/Repos/13-12-2017_config_pdfListados/ApplicaAccWeb/Uploads/Reports");
        foreach (string file in files)
        {
            FileInfo fi = new FileInfo(file);
            if (fi.CreationTime < DateTime.Now.AddDays(-7))
                fi.Delete();
        }
    }
    private static void CleanExcelsOlds()
    {
        string[] files2 = Directory.GetFiles("../../Users/Maxi/Source/Repos/13-12-2017_config_pdfListados/ApplicaAccWeb/Uploads/Excels");
        foreach (string file in files2)
        {
            FileInfo fi = new FileInfo(file);
            if (fi.CreationTime < DateTime.Now.AddDays(-7))
                fi.Delete();
        }
    }

0

আমি অ্যাপ্লিকেশন সেটিংস ফাইল থেকে ডিরেক্টরি তথ্য পেতে একটি পরিষেবা হিসাবে চলমান, একটি কনসোল অ্যাপ্লিকেশনটিতে নিম্নলিখিতটি ব্যবহার করি। ডেটটাইম.নউ এর অ্যাডডেস () পদ্ধতিতে ব্যবহারের জন্য ফাইলগুলি কনফিগারযোগ্য, -1 দ্বারা গুণিত রাখার জন্য দিনের সংখ্যা।

static void CleanBackupFiles()
        {
            string gstrUncFolder = ConfigurationManager.AppSettings["DropFolderUNC"] + "";
            int iDelAge = Convert.ToInt32(ConfigurationManager.AppSettings["NumDaysToKeepFiles"]) * -1;
            string backupdir = string.Concat(@"\", "Backup", @"\");

            string[] files = Directory.GetFiles(string.Concat(gstrUncFolder, backupdir));


            foreach (string file in files)
            {
                FileInfo fi = new FileInfo(file);
                if (fi.CreationTime < DateTime.Now.AddDays(iDelAge))
                {
                    fi.Delete();
                }
            }

        }

0

একটি এসএসআইএসের উদাহরণের উদাহরণ .. (যদি এটি কাউকে সহায়তা করে)

          public void Main()
          {
                 // TODO: Add your code here
        // Author: Allan F 10th May 2019

        //first part of process .. put any files of last Qtr (or older) in Archive area 
        //e.g. if today is 10May2019 then last quarter is 1Jan2019 to 31March2019 .. any files earlier than 31March2019 will be archived

        //string SourceFileFolder = "\\\\adlsaasf11\\users$\\aford05\\Downloads\\stage\\";
        string SourceFilesFolder = (string)Dts.Variables["SourceFilesFolder"].Value;
        string ArchiveFolder = (string)Dts.Variables["ArchiveFolder"].Value;
        string FilePattern = (string)Dts.Variables["FilePattern"].Value;
        string[] files = Directory.GetFiles(SourceFilesFolder, FilePattern);

        //DateTime date = new DateTime(2019, 2, 15);//commented out line .. just for testing the dates .. 

        DateTime date = DateTime.Now;
        int quarterNumber = (date.Month - 1) / 3 + 1;
        DateTime firstDayOfQuarter = new DateTime(date.Year, (quarterNumber - 1) * 3 + 1, 1);
        DateTime lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1);

        DateTime LastDayOfPriorQuarter = firstDayOfQuarter.AddDays(-1);
        int PrevQuarterNumber = (LastDayOfPriorQuarter.Month - 1) / 3 + 1;
        DateTime firstDayOfLastQuarter = new DateTime(LastDayOfPriorQuarter.Year, (PrevQuarterNumber - 1) * 3 + 1, 1);
        DateTime lastDayOfLastQuarter = firstDayOfLastQuarter.AddMonths(3).AddDays(-1);

        //MessageBox.Show("debug pt2: firstDayOfQuarter" + firstDayOfQuarter.ToString("dd/MM/yyyy"));
        //MessageBox.Show("debug pt2: firstDayOfLastQuarter" + firstDayOfLastQuarter.ToString("dd/MM/yyyy"));


        foreach (string file in files)
        {
            FileInfo fi = new FileInfo(file);

            //MessageBox.Show("debug pt2:" + fi.Name + " " + fi.CreationTime.ToString("dd/MM/yyyy HH:mm") + " " + fi.LastAccessTime.ToString("dd/MM/yyyy HH:mm") + " " + fi.LastWriteTime.ToString("dd/MM/yyyy HH:mm"));
            if (fi.LastWriteTime < firstDayOfQuarter)
            {

                try
                {

                    FileInfo fi2 = new FileInfo(ArchiveFolder);

                    //Ensure that the target does not exist.
                    //fi2.Delete();

                    //Copy the file.
                    fi.CopyTo(ArchiveFolder + fi.Name);
                    //Console.WriteLine("{0} was copied to {1}.", path, ArchiveFolder);

                    //Delete the old location file.
                    fi.Delete();
                    //Console.WriteLine("{0} was successfully deleted.", ArchiveFolder);

                }
                catch (Exception e)
                {
                    //do nothing
                    //Console.WriteLine("The process failed: {0}", e.ToString());
                }
            }
        }

        //second part of process .. delete any files in Archive area dated earlier than last qtr ..
        //e.g. if today is 10May2019 then last quarter is 1Jan2019 to 31March2019 .. any files earlier than 1Jan2019 will be deleted

        string[] archivefiles = Directory.GetFiles(ArchiveFolder, FilePattern);
        foreach (string archivefile in archivefiles)
        {
            FileInfo fi = new FileInfo(archivefile);
            if (fi.LastWriteTime < firstDayOfLastQuarter )
            {
                try
                {
                    fi.Delete();
                }
                catch (Exception e)
                {
                    //do nothing
                }
            }
        }


                 Dts.TaskResult = (int)ScriptResults.Success;
          }

0

যেহেতু সঙ্গে সমাধান new FileInfo(filePath)সহজে testable নয়, আমি ক্লাস জন্য wrapper ব্যবহারকারী সুপারিশ Directory, Fileএবং Pathএই রকম:

public interface IDirectory
{
    string[] GetFiles(string path);
}

public sealed class DirectoryWrapper : IDirectory
{
    public string[] GetFiles(string path) => Directory.GetFiles(path);
}

public interface IFile
{
    void Delete(string path);
    DateTime GetLastAccessTime(string path);
}

public sealed class FileWrapper : IFile
{
    public void Delete(string path) => File.Delete(path);
    public DateTime GetLastAccessTimeUtc(string path) => File.GetLastAccessTimeUtc(path);
}

তারপরে এই জাতীয় কিছু ব্যবহার করুন:

public sealed class FooBar
{
    public FooBar(IFile file, IDirectory directory)
    {
        File = file;
        Directory = directory;
    }

    private IFile File { get; }
    private IDirectory Directory { get; }

    public void DeleteFilesBeforeTimestamp(string path, DateTime timestamp)
    {
        if(!Directory.Exists(path))
            throw new DirectoryNotFoundException($"The path {path} was not found.");

        var files = Directory
            .GetFiles(path)
            .Select(p => new
            {
                Path = p,
                // or File.GetLastWriteTime() or File.GetCreationTime() as needed
                LastAccessTimeUtc = File.GetLastAccessTimeUtc(p) 
            })
            .Where(p => p.LastAccessTimeUtc < timestamp);

        foreach(var file in files)
        {
            File.Delete(file.Path);
        }
    }
}

0

কেবল একটি ছোট মুছে ফাংশন তৈরি করুন যা আপনাকে এই কাজটি অর্জনে সহায়তা করতে পারে, আমি এই কোডটি পরীক্ষা করেছি এবং এটি পুরোপুরি ভালভাবে চলে runs

এই ফাংশনটি 90 দিনেরও বেশি পুরানো ফাইলগুলির পাশাপাশি ফোল্ডার থেকে মোছার জন্য এক্সটেনশন .zip সহ একটি ফাইল মুছে দেয়।

Private Sub DeleteZip()

    Dim eachFileInMydirectory As New DirectoryInfo("D:\Test\")
    Dim fileName As IO.FileInfo

    Try
        For Each fileName In eachFileInMydirectory.GetFiles
            If fileName.Extension.Equals("*.zip") AndAlso (Now - fileName.CreationTime).Days > 90 Then
                fileName.Delete()
            End If
        Next

    Catch ex As Exception
        WriteToLogFile("No Files older than 90 days exists be deleted " & ex.Message)
    End Try
End Sub
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.