سؤال

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

private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod)
    {
        Boolean result = false;
        FileStream fs = new FileStream(file.FullName + ".tmp", FileMode.Create, FileAccess.Write);
        StreamWriter sw = new StreamWriter(fs);

        StreamReader streamreader = file.OpenText();
        String originalPath = file.FullName;
        string input = streamreader.ReadToEnd();
        Console.WriteLine("input : {0}", input);

        String tempString = input.Replace(extractedMethod, modifiedMethod);
        Console.WriteLine("replaced String {0}", tempString);

        try
        {
            sw.Write(tempString);
            sw.Flush();
            sw.Close();
            sw.Dispose();
            fs.Close();
            fs.Dispose();
            streamreader.Close();
            streamreader.Dispose();

            File.Copy(originalPath, originalPath + ".old", true);
            FileInfo newFile = new FileInfo(originalPath + ".tmp");
            File.Delete(originalPath);
            File.Copy(fs., originalPath, true);

            result = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

        return result;
    }`

والاستثناء ذي الصلة

System.IO.IOException: The process cannot access the file 'E:\mypath\myFile.cs' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.Delete(String path)
   at callingMethod.modifyFile(FileInfo file, String extractedMethod, String modifiedMethod)

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

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

المحلول

يبدو أن عملية خارجية (AV؟) تقفلها ، لكن ألا يمكنك تجنب المشكلة في المقام الأول؟

private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod)
{
    try
    {
        string contents = File.ReadAllText(file.FullName);
        Console.WriteLine("input : {0}", contents);
        contents = contents.Replace(extractedMethod, modifiedMethod);
        Console.WriteLine("replaced String {0}", contents);
        File.WriteAllText(file.FullName, contents);
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        return false;
    }
}

نصائح أخرى

أدرك أنني تأخرت نوعًا ما ، لكن ما زلت متأخراً أفضل من عدمه. كنت أواجه مشكلة مماثلة مؤخرًا. إستعملت XMLWriter لتحديث ملف XML لاحقًا وكان يتلقى نفس الأخطاء. لقد وجدت الحل النظيف لهذا:

ال XMLWriter يستخدم الأساس FileStream للوصول إلى الملف المعدل. المشكلة هي أنه عندما تتصل XMLWriter.Close() الطريقة ، لا يتم إغلاق الدفق الأساسي ويغلق الملف. ما عليك القيام به هو إنشاء مثيل لك XMLWriter مع الإعدادات وحدد أنك بحاجة إلى إغلاق الدفق الأساسي.

مثال:

XMLWriterSettings settings = new Settings();
settings.CloseOutput = true;
XMLWriter writer = new XMLWriter(filepath, settings);

أتمنى أن يساعد ذلك.

الرمز يعمل بأفضل ما يمكنني قوله. أود أن أطلق النار sysinternals عملية المستكشف واكتشف ما الذي يعيق الملف. قد يكون الاستوديو البصري.

عملت معي.

هنا هو رمز الاختبار الخاص بي. يتبع تشغيل الاختبار:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo f = new FileInfo(args[0]);
            bool result = modifyFile(f, args[1],args[2]);
        }
        private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod) 
        { 
            Boolean result = false; 
            FileStream fs = new FileStream(file.FullName + ".tmp", FileMode.Create, FileAccess.Write); 
            StreamWriter sw = new StreamWriter(fs); 
            StreamReader streamreader = file.OpenText(); 
            String originalPath = file.FullName; 
            string input = streamreader.ReadToEnd(); 
            Console.WriteLine("input : {0}", input); 
            String tempString = input.Replace(extractedMethod, modifiedMethod); 
            Console.WriteLine("replaced String {0}", tempString); 
            try 
            { 
                sw.Write(tempString); 
                sw.Flush(); 
                sw.Close(); 
                sw.Dispose(); 
                fs.Close(); 
                fs.Dispose(); 
                streamreader.Close(); 
                streamreader.Dispose(); 
                File.Copy(originalPath, originalPath + ".old", true); 
                FileInfo newFile = new FileInfo(originalPath + ".tmp"); 
                File.Delete(originalPath); 
                File.Copy(originalPath + ".tmp", originalPath, true); 
                result = true; 
            } 
            catch (Exception ex) 
            { 
                Console.WriteLine(ex); 
            } 
            return result; 
        }
    }
}


C:\testarea>ConsoleApplication1.exe file.txt padding testing
input :         <style type="text/css">
        <!--
         #mytable {
          border-collapse: collapse;
          width: 300px;
         }
         #mytable th,
         #mytable td
         {
          border: 1px solid #000;
          padding: 3px;
         }
         #mytable tr.highlight {
          background-color: #eee;
         }
        //-->
        </style>
replaced String         <style type="text/css">
        <!--
         #mytable {
          border-collapse: collapse;
          width: 300px;
         }
         #mytable th,
         #mytable td
         {
          border: 1px solid #000;
          testing: 3px;
         }
         #mytable tr.highlight {
          background-color: #eee;
         }
        //-->
        </style>

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

حظا طيبا وفقك الله!

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

جرب هذا: إنه يعمل في أي حال ، إذا لم يكن الملف موجودًا ، فسيقوم بإنشائه ثم يكتب إليه. وإذا كانت موجودة بالفعل ، فلن تكون هناك مشكلة فهي ستفتح وتكتب إليها:

 using (FileStream fs= new FileStream(@"File.txt",FileMode.Create,FileAccess.ReadWrite))
 { 
   fs.close();
 }
 using (StreamWriter sw = new StreamWriter(@"File.txt")) 
 { 
   sw.WriteLine("bla bla bla"); 
   sw.Close(); 
 } 

بعد إنشاء ملف ، يجب إجبار الدفق على إصدار الموارد:

//FSm is stream for creating file on a path//
System.IO.FileStream FS = new System.IO.FileStream(path + fname,
                                                   System.IO.FileMode.Create);
pro.CopyTo(FS);
FS.Dispose();
 System.Drawing.Image FileUploadPhoto = System.Drawing.Image.FromFile(location1);
                                 FileUploadPhoto.Save(location2);
                                 FileUploadPhoto.Dispose();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top