سؤال

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

أنا خلق صورة الخلفية ديناميكيا، على الرغم من عدة مرات فقط.

ما هي أفضل طريقة لإنشاء هذه الملفات ثم قم بتنظيفها؟

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

المحلول

أفضل رهان الخاص بك هو أن يكون لديك templaryfilemanager ينفذ خطأ؛ يمكنك طرحها على الملفات المؤقتة، والتي تنشئها ويتصعد تلقائيا في دليل TEMP في مكان ما، ثم يتم حذفها جميعا عند التخلص منها، إما بواسطتك أو التأثير النهائي (إذا قمت بتنفيذ النمط المتاح بشكل صحيح)

نصائح أخرى

إليك كيفية الحصول على المسار الكامل واسم الملف لملف مؤقت:

string tempFile = System.IO.Path.GetTempFileName();

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

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

public static string Write(Stream stream)
{
   string FileName = Path.GetTempFileName();

   // Write the contents of stream to a file with FileName

   return FileName;
}

بعد ذلك، لدي طريقة أخرى تقبل مسار ملف للحذف اللاحق الذي يعد عضوا في فئة "تحليل" الخاص بي، على الرغم من أنه يمكنك وضعه في فئة المساعد الثابتة الخاصة به:

public string ForDeletion(string path)
{
   ListOfPaths.Add(path);

   return path;
}

أخيرا، أقوم بما يلي:

SomeApiFunction(ForDeletion(TempFile.Write(myStream)));

هذه هي أفضل طريقة وصلت إليها للتحايل على قلة إمكانات واجهة برمجة التطبيقات في إمكانيات معالجة الدفق.

يمكنني استخدام هذا الحل:

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();

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

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