Удалить файл после создания - PullRequest
3 голосов
/ 28 декабря 2011

Я пытаюсь удалить файл после его создания, но просто не могу.Сообщение об ошибке состоит в том, что он все еще используется процессом.Я работаю над приложением winform.

Вот мой код:

XmlDocument xmlDoc = new XmlDocument();
XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xmlDec);

XmlElement elmRoot = xmlDoc.CreateElement("testConfig");
xmlDoc.AppendChild(elmRoot);

GetConfigTags(xmlDoc, elmRoot, clientToken);

StreamWriter wText = 
    new StreamWriter(CommonCodeClass.configLocation + "EmailConfig.xml");
xmlDoc.Save(wText);
wText.Flush();
wText.Close();
wText.Dispose();
File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");

Я также пробовал код ниже, но та же ошибка, файл используется другим процессом

try
{
    File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");
}
catch  //or maybe in finally
{
    GC.Collect(); //kill object that keep the file. I think dispose will do the trick as well.
    Thread.Sleep(500); //Wait for object to be killed. 
    File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml"); //File can be now deleted
    log.Error(CommonCodeClass.configLocation + "EmailConfig.xml" + " was deleted forcefully as it was being used by the process.");

}

Я где-нибудь пропускаю закрытие файла?

Пожалуйста, помогите.Спасибо.

вот код для getconfigtag: он просто создает теги для применения в файле конфигурации.

 internal static void GetConfigTags(XmlDocument xmlDoc, XmlElement elmRoot, string clientToken)
    {
        // Username Element            
        XmlElement elmUsername = xmlDoc.CreateElement(CommonCodeClass.xml_Username);
        XmlAttribute xaUsername = xmlDoc.CreateAttribute("val");
        xaUsername.Value = "singleVal";
        elmUsername.InnerXml = "";
        elmUsername.Attributes.Append(xaUsername);
        elmRoot.AppendChild(elmUsername);
     }

StackTrace:

в системе.IO .__ Error.WinIOError (Int32 errorCode, String MaybeFullPath) в System.IO.File.Delete (String path) в ShareMgmt.CommonCodeClass.EmailTheConfigFile (String userEmail, String clientToken) в C: \ Users \ ddsds \ Documents \ Visual Studio2008 \ Projects \ ShareMgmt \ Mgmt \ CommonCodeClass.cs: строка 756 в ShareMgmt.UsersForm.btnConfigToAdmin_Click (отправитель объекта, EventArgs e) в C: \ Users \ ddsds \ Documents \ Visual Studio 2008 \ Projects \ ShareMgmt \ Mgmt \ UsersForm.cs: строка 1122

Ответы [ 3 ]

4 голосов
/ 28 декабря 2011

Код работает для меня, но я рекомендую оператор using каждый раз, когда вы используете экземпляр класса, который реализует IDisposable .

Другое дело: никогда не звоните GC.Collect(), чтобы попытаться заставить GC провести очистку для вас. Если вы правильно распорядитесь своими экземплярами (с ключевым словом using, который вы не забудете), GC не нужно, чтобы вы говорили ему, что делать.

4 голосов
/ 28 декабря 2011

"Я пропускаю закрытие файла где-нибудь?" Вы можете быть уверен , что файл закрывается с помощью оператора 'using'.

    XmlDocument xmlDoc = new XmlDocument();
    XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
    xmlDoc.AppendChild(xmlDec);

    XmlElement elmRoot = xmlDoc.CreateElement("testConfig");
    xmlDoc.AppendChild(elmRoot);

    GetConfigTags(xmlDoc, elmRoot, clientToken);

    using (StreamWriter wText = new StreamWriter(CommonCodeClass.configLocation + "EmailConfig.xml"))
    {
            xmlDoc.Save(wText);
            wText.Flush();
    }

    File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");

Этот код работает для меня, но так же как и вариант вашего оригинала, так что кроме этого, я не совсем уверен, в чем проблема.

Добавление:

Судя по вашей трассировке стека, вы пытаетесь отправить файл XML по электронной почте. В этом случае и вы используете SmtpClient, вам даже не нужно записывать XML-документ в файл.

MemoryStream memoryStream = new MemoryStream();
xmlDoc.Save(memoryStream);

// ...

mailMessage.Attachments.Add(
    new Attachment(memoryStream, "EmailConfig.xml", "application/xml"));
0 голосов
/ 28 декабря 2011

xmlDoc все еще имеет дескриптор файла.

Поместите код, который создает файл, в функцию, чтобы xmlDoc выходил из области видимости при удалении.Возможно, вам придется вызвать GC.Collect ().Чтобы быть уверенным, что это одна из самых больших проблем, с которыми я столкнулся.

Или вы можете поместить {} вокруг кода, не помещая его в функцию.Вы всегда можете использовать {} для создания различных областей.

Таким образом, ваш код выше:

// other preceeding code    
{
    XmlDocument xmlDoc = new XmlDocument();
    XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
    xmlDoc.AppendChild(xmlDec);

    XmlElement elmRoot = xmlDoc.CreateElement("testConfig");
    xmlDoc.AppendChild(elmRoot);

    GetConfigTags(xmlDoc, elmRoot, clientToken);

    StreamWriter wText = 
        new StreamWriter(CommonCodeClass.configLocation + "EmailConfig.xml");
    xmlDoc.Save(wText);
    wText.Flush();
    wText.Close();
    wText.Dispose();
}

File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...