Система. IO.IOException: файл используется другим процессом

Приложения UWP не только запускаются на настольном компьютере, но и на планшете, телефоне и т. Д. Итак, то, что вы хотите установить на страницу фиксированного размера, нереально. Но вы можете вызвать метод ApplicationView.TryResizeView (Size) , чтобы изменить размер представления.

Если вы все еще хотите иметь фиксированный размер страницы во время выполнения, вы можете обработать событие страницы SizeChanged, в ее обработчике событий вы можете вызвать метод ApplicationView.TryResizeView, чтобы изменить его размер до исходного размера.

25
задан gorkem 2 November 2017 в 09:47
поделиться

6 ответов

Похоже, внешний процесс (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;
    }
}
24
ответ дан 28 November 2019 в 18:25
поделиться

Так как моя репутация слишком маленькая для комментария ответа, вот моя обратная связь относительно ответа roquen (использующий настройки на xmlwriter, чтобы вынудить поток закрыться): это работает отлично, и это заставило меня сэкономить много времени. пример roquen требует некоторой корректировки, вот код, который работает над платформой.NET 4.8:

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.CloseOutput = true;
    writer = XmlWriter.Create(stream, settings);
0
ответ дан 28 November 2019 в 18:25
поделиться

Код работает, насколько я могу судить. Я бы запустил Sysinternals process explorer и выяснил, что держит файл открытым.

5
ответ дан 28 November 2019 в 18:25
поделиться

У меня это сработало

Вот мой тестовый код. Далее следует тестовый прогон:

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>
4
ответ дан 28 November 2019 в 18:25
поделиться

Вы случайно не запускаете антивирусный сканер в реальном времени? Если это так, вы можете попробовать (временно) отключить его, чтобы проверить, обращается ли он к файлу, который вы пытаетесь удалить. (Предложение Криса использовать Sysinternals process explorer - хорошее предложение).

3
ответ дан 28 November 2019 в 18:25
поделиться

Я понимаю, что немного опоздал, но все же лучше поздно, чем никогда. Недавно у меня была аналогичная проблема. Я использовал XMLWriter для последующего обновления файла XML и получал те же ошибки. Я нашел для этого чистое решение:

XMLWriter использует базовый FileStream для доступа к измененному файлу. Проблема в том, что при вызове метода XMLWriter.Close () базовый поток не закрывается и блокирует файл. Что вам нужно сделать, так это создать экземпляр вашего XMLWriter с настройками и указать, что вам нужно закрыть этот базовый поток.

Пример:

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

Надеюсь, это поможет.

19
ответ дан 28 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: