سؤال

أحتاج إلى العمل مع بعض الملفات المؤقتة في تطبيق Windows Forms .NET 3.5 الخاص بي.يتم فتح هذه الملفات في تطبيق خارجي يمكن بالطبع تشغيله لفترة أطول من برنامجي الخاص.

هل هناك أي أفضل الممارسات للتأكد من تنظيف هذه الملفات المؤقتة في أي وقت لتجنب ملء القرص الصلب للمستخدم بالملفات "غير المرغوب فيها" التي لم تعد هناك حاجة إليها؟أو هل يتعامل Windows مع هذا الأمر تلقائيًا؟

مثال جيد هو أي عميل بريد:عند فتح مرفق في أي تطبيق، عادة ما يتم كتابته في ملف مؤقت يتم فتحه.هل هناك طريقة لمعرفة كيفية إدارة هذه الملفات لعملية التنظيف؟

لقد أظهر لي استخدام Google العديد من أدوات التنظيف والضبط لتنظيف الدليل المؤقت يدويًا، لكنني لا أرغب في إجبار المستخدمين على القيام بذلك.:-)

هو موضع تقدير أي مساعدة.

ماتياس

هل كانت مفيدة؟

المحلول

إذا حاولت مسح حتمي محتويات مجلد الملفات المؤقتة نوع، هل خطر إزالة الملفات التي هي قيد الاستخدام من قبل عمليات أخرى. نظام التشغيل ويندوز يوفر أدوات للسماح للمستخدمين لإزالة هذه الملفات عندما يصل المساحة المتوفرة على القرص وحدة التخزين عتبة معينة.

والآن، إذا كان يمكنك تحديد ذلك بعد استخدام ملف مؤقت محددة من شأنها أن تكون هناك حاجة إلى أنها لم تعد، ثم ليس هناك الجانب السلبي لحذف هذا الملف محددة.

نصائح أخرى

في. NET يمكنك استخدام فئة TempFileCollection لإدارة مجموعة من الملفات المؤقتة إلى أن تنظيف قبل التطبيق الخاص بك (لاحظ أنه يتم إخفاء بدلا في مساحة الاسم CodeDom). من الواضح أنك لا تستطيع حذف أية ملفات ليست مملوكة من قبل نفسك، لأنه ربما لا يزال يتم فتح الملفات من قبل تطبيق آخر (وحذفها قد يسبب مشاكل خطيرة).

وتقع مسؤولية تنظيف الملفات المؤقتة يجب أن يكون على التطبيق الذي خلقهم. فمن السهل جدا. I استخدام فئة ويبدو أن شيئا من هذا القبيل:

public class TempFile : IDisposable
{
    public TempFile()
    { this.path = System.IO.Path.GetTempFileName(); }

    public void Dispose()
    { File.Delete(path); }

    private string path;
    public string Path { get { return path; } }
}

إذا هل هناك حاجة لتنظيف الملفات المؤقتة تطبيق آخر، انها تحتاج بعض وسائل التواصل مع يدكم. كحد أدنى يجب أن يكون قادرا على توفير الإشارة. ومع ذلك التعقيد للقيام بذلك هو أكبر من تعقيد مجرد وجود تطبيق منشؤها رعاية الملفات الخاصة بها.

لدينا مشكلة ملف عمر مماثلة - التطبيق (WinForms عناصر) يمكن أن تجلب مستند من مخزن مستودع مركزي للمستخدم لعرض، ولكن يجب أن يكون المستخدم قادرا على إغلاق التطبيق لدينا دون أن تؤثر على ملف كانوا يشاهدون. بسبب مخاوف أمنية تحتاج إلى تنظيف لذلك هم لا حول الكذب وقتا طويلا في ملفات المستندات.

والحل الذي نستعمله هو لإنشاء مجلد مع اسم المستمدة من التاريخ في منطقة التخزين معزولة المستخدمين واستخدام ذلك مخبأ اليوم. في تطبيق وثيقة لأسفل وبدء نتحقق من وجود مخبأ المجلدات مؤرخة السابقة وحذفها (والمحتويات).

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

في الأيام التي كان الناس يوقفون فيها تشغيل أجهزة الكمبيوتر الخاصة بهم كل يوم، ربما كان هذا هو الحل الأمثل.

الآن، من المحتمل أن يمضي الأشخاص شهورًا دون تسجيل الخروج، لذلك قد لا يكون الاعتماد على ذلك فكرة جيدة.

وأيضًا، إذا قاموا بإيقاف تشغيل أجهزتهم دون إيقاف التشغيل، فلن يتم حذف الملفات أيضًا.

يمكنك استخدام مراقب نظام الملفات الذي يراقب الملف الذي تكتبه، وينتظر فترة من عدم النشاط (10 دقائق، أو ساعة واحدة، أو يوم واحد، أو أي شيء آخر) ثم يحذف الملف.

هذا لن ينجح في كل شيء بالرغم من ذلك.قد تحتوي بعض البرامج على ملف "مفتوح"، ولكن قد لا يكون الملف الأساسي مقفلاً.إذا حدث ذلك، فلن يكون لديك أي وسيلة لمعرفة متى يكون حذف الملف آمنًا.

ومع ذلك، أعتقد أنه ربما يمكنك تجاهل المشكلة.من المحتمل أن يكون لدى معظم الأشخاص فائض في مساحة القرص الصلب على أي حال، لذلك من غير المرجح أن يستغلوا هذه المساحة.إذا فعلوا ذلك، فأعتقد أن Windows سينبثق مربع حوار لمساحة القرص المنخفضة يمنحهم خيار مسح الدليل المؤقت الخاص بهم، مما قد يحل المشكلة.

تحديث:

أعتقد أن Windows Update سيقوم بإعادة تشغيل جهاز الكمبيوتر الخاص بالمستخدم مرة واحدة تقريبًا في الشهر، لذلك يجب مسح الملفات المؤقتة عند حدوث ذلك.

ليس هناك ما يضمن عدم وجود مشاكل، ولكن من الناحية العملية أعتقد أنها يجب أن تكون نادرة جدًا.

التحديث 2:

بناءً على تعليق، ذهبت واختبرت هذا بالفعل، ويبدو أن Windows لا يحذف الملفات المؤقتة عندما يقوم المستخدم بتسجيل الخروج.ومع ذلك، ما زلت أقول أنه في حالة OP، هذه ليست مشكلة حقيقية.عندما تصبح مشكلة (بسبب انخفاض مساحة القرص)، سيطالب Windows المستخدم بحذف الملفات المؤقتة.

عند استخدام الملفات المؤقتة في ASP.NET، استخدام الحدث PAGE_DISPOSED حذف أي ملفات مؤقتة قمت بإنشائه في الصفحة. وإلا قد ينتهي بك الأمر مع خلاف مع المكونات التي لا ندعها تفلت من أيدينا حتى التخلص منها.

وأنا استخدم هذا الحل (موثوق جدا):

using System.IO;
using System.Reflection;

namespace Konard.Helpers
{
    public static partial class TemporaryFiles
    {
        private const string UserFilesListFilenamePrefix = ".used-temporary-files.txt";
        static private readonly object UsedFilesListLock = new object();

        private static string GetUsedFilesListFilename()
        {
            return Assembly.GetEntryAssembly().Location + UserFilesListFilenamePrefix;
        }

        private static void AddToUsedFilesList(string filename)
        {
            lock (UsedFilesListLock)
            {
                using (var writer = File.AppendText(GetUsedFilesListFilename()))
                    writer.WriteLine(filename);
            }
        }

        public static string UseNew()
        {
            var filename = Path.GetTempFileName();
            AddToUsedFilesList(filename);
            return filename;
        }

        public static void DeleteAllPreviouslyUsed()
        {
            lock (UsedFilesListLock)
            {
                var usedFilesListFilename = GetUsedFilesListFilename();

                if (!File.Exists(usedFilesListFilename))
                    return;

                using (var listFile = File.Open(usedFilesListFilename, FileMode.Open))
                {
                    using (var reader = new StreamReader(listFile))
                    {
                        string tempFileToDelete;
                        while ((tempFileToDelete = reader.ReadLine()) != null)
                        {
                            if (File.Exists(tempFileToDelete))
                                File.Delete(tempFileToDelete);
                        }
                    }
                }

                // Clean up
                using (File.Open(usedFilesListFilename, FileMode.Truncate)) { }
            }
        }
    }
}

وفي كل مرة كنت بحاجة إلى استخدام الملف المؤقت:

var tempFile = TemporaryFiles.UseNew();

لتأكد يتم حذف كافة الملفات المؤقتة بعد إغلاق التطبيق أو وضع تحطم

TemporaryFiles.DeleteAllPreviouslyUsed();

في بداية التطبيق.

  • يمكنك إنشاء ملف مؤقت واحد، يمكنك من خلاله الاستمرار في كتابة أسماء الملفات التي تم إنشاؤها أثناء العملية، وفي نهاية المعالجة قد يمكنك (شرط مسبق - تنفيذ IDisposable و) الحذف في طريقة Disponse بعد اكتمال العملية.

  • الطريقة الأخرى هي كتابة عملية مستقلة تقوم بالتنظيف كل فترة زمنية.

  • قم بإرفاق التاريخ في نهاية الملف، واحذفه في نهاية اليوم بهذا التاريخ، وستقوم العملية بإنشاء ملفات جديدة مع تاريخ جديد في النهاية.

  • أحد الاقتراحات الجيدة المقدمة من فئة divo tempfilecollection.

نأمل أن يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top