إذا البيانات لتقييم تواريخ ملفات متعددة

أنا جديد على C# (أقل من أسبوع) ، لدي الشفرة التالية التي تحذف ملفًا على وحدة تخزين. وهو ملف احتياطي لقاعدة بيانات SQL. ويستمر في النمو بشكل دوري لذا يجب إعادة تسمية الملف ثم حذفه بعد نسخ ملف جديد احتياطيًا. أحتاج لتقييم ما إذا كان النسخ الاحتياطي قيد التشغيل ومن ثم فإنه من المقبول حذف الملف.

    using System;
using System.IO;

class Program
{
    static void Main()
    {
        //
       //Delete a file found on the D:\ volume.
       //If the file is not found (File doesn't exist),
       //then you will get an exception.
        //
        try
        {
            File.Delete(@"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\FT_Trans_Log_Appendedold.BAK");//Try to delete
            Console.WriteLine("Deleted");//Success
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex);//Write error
        }
    }
}

هذا هو المنطق. إذا سألتني كثيرًا ، فأخبرني بذلك:

  • إذا كان تاريخ اليوم هو = الاثنين وكان تاريخ FT_FabTrol_Sun_Full.BAK أقل من يومين من العمر ، فلا بأس بحذف الملف المسمى FT_Trans_Log_Appendedold.BAK
  • آخر إذا كان تاريخ اليوم هو = الثلاثاء وموعد الملف FT_FabTrol_Mon_Full.BAK أقل من يومين من العمر ، فلا بأس بحذف الملف المسمى FT_Trans_Log_Appendedold.BAK
  • Else إذا كان تاريخ اليوم هو = الأربعاء وكان تاريخ FT_FabTrol_Tues_Full.BAK أقل من يومين من العمر ، فلا بأس بحذف الملف المسمى FT_Trans_Log_Appendedold.BAK
  • Else إذا كان تاريخ اليوم هو = الخميس وموعد الملف FT_FabTrol_Wed_Full.BAK أقل من يومين من العمر ، فلا بأس بحذف الملف المسمى FT_Trans_Log_Appendedold.BAK
  • Else إذا كان تاريخ اليوم هو = الجمعة وكان الملف FT_FabTrol_Thurs_Full.BAK أقل من يومين من العمر ، فلا بأس بحذف الملف المسمى FT_Trans_Log_Appendedold.BAK
  • Else إذا كان تاريخ اليوم هو = السبت وملف FT_FabTrol_Fri_Full.BAK أقل من يومين من العمر ، فلا بأس بحذف الملف المسمى FT_Trans_Log_Appendedold.BAK
  • Else إذا كان تاريخ اليوم هو = الأحد وملف FT_FabTrol_Sat_Full.BAK أقل من يومين من العمر ، فلا بأس بحذف الملف المسمى FT_Trans_Log_Appendedold.BAK
1
ربما تريد حذف الملفات التي مضى عليها أكثر من يومين والاحتفاظ بالملفات الأحدث منها؟
وأضاف المؤلف Steve, مصدر
يمكنك تخطي كل تلك الأكواد . إذا لم يكن الملف أقدم من يومين ، فاحذفه. هل هذا صحيح؟
وأضاف المؤلف Andre Calil, مصدر
يمكن لفئة FileInfo مساعدتك في الحصول على معلومات حول إنشاء/تعديل التواريخ. msdn.microsoft.com/en-us/library/system. io.fileinfo.aspx
وأضاف المؤلف Gray, مصدر
MichaelTerrian قمت بتحديث إجابتي لتناسب متطلباتك (على ما أظن). لمعلوماتك فقط.
وأضاف المؤلف Gray, مصدر
نشرت جوابًا يفعل كلا الأمرين.
وأضاف المؤلف Nick Bray, مصدر
لا ، هناك شرطان يجب الوفاء بهما. 1) إذا كان تاريخ اليوم هو = الأحد 2) وكان تاريخ الملف FT_FabTrol_Sat_Full.BAK أقل من يومين ، فيمكنك حذف الملف المسمى FT_Trans_Log_Appendedold.BAK
وأضاف المؤلف Michael Terrian, مصدر

7 إجابة

يمكنك تبسيط هذا المنطق بشكل كبير مع: -

FileInfo info = new FileInfo(@"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\FT_Trans_Log_Appendedold.BAK");
if(DateTime.Now.AddDays(-2) > info.LastWriteTime.Date)
{
    //Delete
}
3
وأضاف

كل ما عليك القيام به هو التكرار على جميع الملفات الموجودة في مجلدك وحذف تلك التي مضى عليها أكثر من يومين ، صحيح (يبدو أن ذلك هو بيانك الشرطي العملاق الذي يأتي إلى)؟

لذلك ، استخدم السطر التالي للحصول على كافة الملفات في المجلد:

string[] files = Directory.GetFiles();

ثم ، في حلقة ، قم بالتكرار على جميع أسماء الملفات في files وتحقق ، سواء كانت قديمة بما فيه الكفاية.

للحصول على الطابع الزمني للملف ، استخدم FileInfo و LastWriteTime مثل هذا:

if(DateTime.Today - someFileInfoObject.LastWriteTime.Date > new TimeSpan(2,0,0,0))
{
    File.Delete(); 
}
1
وأضاف

حاول أدناه التعليمات البرمجية.

 string backupFile = @"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\FT_Trans_Log_Appendedold.BAK";
 FileInfo fi = new FileInfo(backupFile);
 DateTime fileCreatedDate = File.GetCreationTime(backupFile);
 DateTime today = DateTime.Now;
 if (today.DayOfWeek != DayOfWeek.Monday && fileCreatedDate > today.AddDays(-2))
     {
        fi.Delete();
     }
0
وأضاف

تحديث إجابتي لتلبية الاحتياجات الخاصة بك. كيندا غريبة ، لكنني كنت أشعر بالملل. قد يكون من المفيد قراءة فقط.

//2 days
TimeSpan daysToKeep = new TimeSpan(2,0,0,0);

//The folder where the files are kept
DirectoryInfo backupFolder = new DirectoryInfo(@"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\");
//the Appendold.BAK file
FileInfo backupLog = new FileInfo(backupFolder.FullName + @"\FT_Trans_Log_Appendedold.BAK");

//the base name for the log files
string logName = "FT_FabTrol_{0}_Full.BAK";
//an array for the days of week that are part of the logname
string[] days = { "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat" };
//get yesterday's log file name
string yesterdayLog = String.Format(logName, days[(int)DateTime.Today.AddDays(-1).DayOfWeek]);
//create file info
FileInfo logFile = new FileInfo(backupFolder.FullName + yesterdayLog);

//if the file exists, and it is less than 2 days old
try
{
    if (logFile.Exists && (DateTime.Today - logFile.LastWriteTime < daysToKeep))
    {
        backupLog.Delete();
        Console.WriteLine("success");
    }
    else
    {
        Console.WriteLine("log file either did not exist or is not ready to delete");
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}
0
وأضاف

بناءً على ما علّقهGray ، فإن كائن FileInfo سيسمح لك بمعرفة ما إذا كان .Exists أم لا ، مما يخفف من الحاجة إلى الاعتماد على المحاولة/catch لمعرفة ما إذا كان الملف لا يزال موجودًا.

خذ بعين الاعتبار ما يلي:

static void Main()
{
    FileInfo fi = new FileInfo(@"\\path\\to\\file.bak");

    if(fi.Exists)
    {
        try
        {
            //because we can still get errors based on permissions etc.
            fi.Delete(); 
            Console.WriteLine("Deleted");//Success
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex);//Write error
        }  
    }
}
0
وأضاف

شخصيا لمدة أسبوع واحد من الخبرة أود أن أقول لقد قفزت في نهاية العميق.

I'm not going to provide code, rather direct you to improve your learning, this is referred to psuedo code

  1. انظر إلى مؤلف البث /القارئ وملف الملف fileinfo. </لى>
  2. ومن ثم يمكنك قراءة الملفات وحذفها/إعادة تسميتها/ما تريده حقًا.
  3. يتعين عليك عندئذٍ محاولة فهم كيف يمكنني التحقق مما أفعله . للأسف بالنسبة للمبتدئين هذا أصعب مما قد تعتقد ، وربما أصعب من أول نقطتين لبعض الناس. فكر في الأمر من خلال عملية بسيطة ، فعادةً ما يعمد مطورو البرامج إلى تعقيد الأمور. هذا الجزء في الواقع سهل إلى حدٍ ما طالما أن ملفك صحيح!

قد ترغب في النظر في اختبار الوحدة لأن هذا قد يساعد في التحقق من صحتها.

0
وأضاف

يتحقق هذا الرمز 1 إذا كان الملف المستند إلى اليوم أقل من يومين ، ثم إذا كان حذف الملف FT_Trans_Log_Appendedold.BAK.

                string dir = @"\\Fabtrol-2\Program Files (x86)\FabTrolBackUp\";
                string fileName = dir;
                switch (DateTime.Now.DayOfWeek)
                {
                    case DayOfWeek.Monday:
                        fileName += "FT_FabTrol_Sun_Full.BAK";
                        break;
                    case DayOfWeek.Tuesday:
                        fileName += "FT_FabTrol_Mon_Full.BAK";
                        break;
                    case DayOfWeek.Wednesday:
                        fileName += "FT_FabTrol_Tues_Full.BAK";
                        break;
                    case DayOfWeek.Thursday:
                        fileName += "FT_FabTrol_Wed_Full.BAK";
                        break;
                    case DayOfWeek.Friday:
                        fileName += "FT_FabTrol_Thurs_Full.BAK";
                        break;
                    case DayOfWeek.Saturday:
                        fileName += "FT_FabTrol_Fri_Full.BAK";
                        break;
                    case DayOfWeek.Sunday:
                        fileName += "FT_FabTrol_Sat_Full.BAK";
                        break;
                }

                FileInfo fi = new FileInfo(fileName);
                if (fi.Exists && DateTime.Now.AddDays(-2) > fi.LastWriteTime.Date)
                {
                    (new FileInfo(dir + "FT_Trans_Log_Appendedold.BAK")).Delete();
                    Console.WriteLine("Deleted");
                }
0
وأضاف
هذا ليس أفضل بكثير مما لدى OP بالفعل
وأضاف المؤلف dtsg, مصدر
كان في C# ما كتبه في الكلمات. فهمت أن السؤال يسأل كيف يكتب بيانه إذا كان في ج #. لا أعتقد أن السؤال كان حول كيفية اختبار ما إذا كان عمره يومين.
وأضاف المؤلف Nick Bray, مصدر
ضع هذا في كتلة المحاولة من التعليمات البرمجية.
وأضاف المؤلف Nick Bray, مصدر
MichaelTerrian أنا إصلاحه عن طريق إزالة الإضافية() في هذا الخط
وأضاف المؤلف Nick Bray, مصدر
MichaelTerrian أوه آسف لديك لتغيير الخط. اسم الملف string = dir؛
وأضاف المؤلف Nick Bray, مصدر
نيك حاول ذلك ولكن الحصول على خطأ اسم الأسلوب المتوقع على هذا الخط (جديد FileInfo (dir + "FT_Trans_Log_Appendedold.BAK") ()). Delete ()؛
وأضاف المؤلف Michael Terrian, مصدر
حسنا سوف أعطيها شكرا المحاولة
وأضاف المؤلف Michael Terrian, مصدر
عند التصحيح ، تظهر لي رسالة الخطأ "استخدام متغير محلي غير مُعين 'fileName'"
وأضاف المؤلف Michael Terrian, مصدر
يمكنني getpast الخطأ إذا أضفت هذا إلى اسم الملف string = Path.GetFileName (@ "\\ Fabtrol-2 \ Program Files (x86) \ FabTrolBackUp \")؛
وأضاف المؤلف Michael Terrian, مصدر
نيك الذي فعل الخدعة. كان علي أن أقوم بتغيير أكثر قليلاً لكنه يعمل بالطريقة التي أحتاج إليها. شكرا جزيلا.
وأضاف المؤلف Michael Terrian, مصدر