سؤال

لدي تطبيق إنترانت 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 على الأقل).

عفوًا!

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