ASP.NET كيف أنتظر تحميل/إصدار الملف؟
-
26-09-2020 - |
سؤال
لدي تطبيق إنترانت ASP.NET مكتوب بلغة VB.فهو يحصل على ملف من المستخدم، وبعد ذلك، اعتمادًا على بعض الحالات المختلفة، قد يقوم بإنشاء بضع نسخ من الملف بالإضافة إلى نقل الملف الأصلي.
لسوء الحظ واجهت حالة تلقيت فيها هذا الخطأ:
Exception Details: System.IO.IOException: The process cannot access the file
'\\some\dir\D09_03_5_180_0.000-6.788.png' because it is being used by
another process.
الذي ألقي به My.Computer.FileSystem.CopyFile
.ولا بأس أن يتم استخدامه من قبل عملية أخرى - ربما لا يزال يتم حفظه/تنزيله من المستخدم أو محاولة النسخ أثناء قيام سلسلة رسائل أخرى (؟) بالنسخ، لا يهمني ذلك حقًا، ما أريد معرفته:
هل هناك أي طريقة يمكنني من خلالها إخبار VB بالانتظار لنسخ (نقل) الملف حتى لا يصبح الملف قيد الاستخدام؟
شكرًا
المحلول
اختبر ما إذا كان الملف قيد الاستخدام وافعل ما عليك القيام به.
WriteLogFile الفرعي العام (ByVal pText كسلسلة، ByVal psPath كسلسلة، ByVal psName كسلسلة)
Dim strFullFileName As String
Dim Writer As System.IO.StreamWriter
Dim Fs As System.IO.FileStream
Try
Dim DirectoryHandler As New System.IO.DirectoryInfo(psPath)
strFullFileName = psPath & "\" & psName & Date.Today.Month.ToString & "-" & Date.Today.Day.ToString & "-" & Date.Today.Year.ToString & ".txt"
If Not DirectoryHandler.Exists() Then
Try
Monitor.Enter(fsLocker)
DirectoryHandler.Create()
Finally
Monitor.Exit(fsLocker)
End Try
End If
Try
If CheckIfFileIsInUse(strFullFileName) = True Then
Thread.Sleep(500) ' wait for .5 second
WriteLogFile(pText, psPath, psName)
If Not Fs Is Nothing Then Fs.Close()
If Not Writer Is Nothing Then Writer.Close()
Exit Sub
End If
Monitor.Enter(fsLocker)
Fs = New System.IO.FileStream(strFullFileName, IO.FileMode.Append, IO.FileAccess.Write, IO.FileShare.Write)
Writer = New System.IO.StreamWriter(Fs)
Writer.WriteLine(Date.Now.ToString & vbTab & "ProcessID: " & Process.GetCurrentProcess.Id.ToString() & vbTab & pText)
Writer.Close()
Fs.Close()
Finally
Monitor.Exit(fsLocker)
End Try
Catch ex As Exception
Dim evtEMailLog As System.Diagnostics.EventLog = New System.Diagnostics.EventLog()
evtEMailLog.Source = Process.GetCurrentProcess.ProcessName.ToString()
evtEMailLog.WriteEntry(ex.Message, System.Diagnostics.EventLogEntryType.Error)
Finally
If Not Fs Is Nothing Then Fs.Close()
If Not Writer Is Nothing Then Writer.Close()
End Try
إنهاء الوظيفة العامة الفرعية checkiffileisinuse (byval sfile كسلسلة) كـ boolean if system.io.file.exists (sfile) ثم حاول dim f على أنه قصير = freefile () fileOpen (f ، sfile ، openmode.append ، OpenAccess.write ، openshare. مشترك) fileClose (f) catch return end true حاول النهاية إذا كانت وظيفة النهاية
نصائح أخرى
همم...لا مباشرة.ما تفعله معظم التطبيقات هو إعادة محاولة نسخ الملف، مع إطار زمني صغير (بضع ثواني)
إذا كنت ترغب في إنشاء واجهة مستخدم جميلة، يمكنك التحقق عبر Ajax مما إذا كانت عملية النسخ تسير بشكل جيد.
حسنًا، اتضح أن الانتظار لن ينجح في هذه الحالة:
عند محاولة نسخ ملف، لا يمكنك نسخ ملف من موقع واحد إلى نفس الموقع وإلا فسيظهر خطأ (على ما يبدو).بدلاً من مجرد التظاهر بنسخ الملف، يحاول VB فعلياً نسخ الملف ويفشل لأن عملية النسخ تحاول النسخ إلى الملف الذي تنسخ منه (مع overwrite:=True
على الأقل).
عفوًا!