WriteFile vs Transmitfile للملفات الكبيرة التي تحتاج إلى حذفها من الخادم بعد النقل

StackOverflow https://stackoverflow.com/questions/2187252

سؤال

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

يعد WriteFile متزامنًا ، لكنه يخزن الملف في الذاكرة قبل إرساله إلى المستخدم. نظرًا لأنني أتعامل مع ملفات كبيرة جدًا ، فقد يتسبب ذلك في مشاكل.

TransmitFile لا تخزن محليًا ، لذا فهو يعمل مع الملفات الكبيرة ، لكنه غير متزامن ، لذلك لا يمكنني حذف الملف بعد استدعاء TransmitFile. يبدو أن التنقيب عن الملف لا يضمن أنه يمكنني حذفه أيضًا؟

ما هي أفضل طريقة للتعامل مع هذا؟

هناك أيضًا BinaryWrite ... هل يمكنني حلقة دفق الملفات ، ونسخه في الأجزاء؟

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

المحلول

إليك حلًا جيدًا يستخدم Transmitfile ولكنه يتيح لك القيام بشيء ما بمجرد الانتهاء من ذلك باستخدام مندوب:

http://improve.dk/blog/2008/03/29/response-transmitfile-lolswill-kill-your-application

فقط استبدل التسجيل في النهاية بحذف الملف.

نصائح أخرى

يعد WriteFile متزامنًا ، لكنه يخزن الملف في الذاكرة قبل إرساله إلى المستخدم. نظرًا لأنني أتعامل مع ملفات كبيرة جدًا ، فقد يتسبب ذلك في مشاكل.

أعتقد أنه يمكنك تعطيل التخزين المؤقت للكتابة عن طريق ضبط الاستجابة. bufferoutput = false ؛

بمجرد ضبط هذا على خطأ ، يجب أن تكون قادرًا على استدعاء الكتابة دون التخزين المؤقت ...

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

الكتابة يتم استخدام الطريقة لتنزيل الملف الصغير من الخادم ، يجب أن تكون معلمة الحجم بين الصفر والحد الأقصى لقيمة int32 ، قبل نقل الملف ، فإنه يخزن الملف في الذاكرة. Transmitfile يتم استخدام الطريقة لتنزيل الملف الكبير من الخادم ولا يتم عزل الملف إلى الذاكرة. ولكن عند محاولة حذف الملف أثناء تنزيله ، فإنه يلقي الاستثناء. فيما يلي الرمز الذي يحذف الملف بعد تنزيله.

 FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
        MemoryStream ms = new MemoryStream();
        fs.CopyTo(ms);
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(ms.ToArray());
        fs.Close();
        File.Delete(@"D:\FileDownLoad\DeskTop.zip");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top