Сохранение растрового изображения, которое используется C # [дубликат]

Несмотря на то, что принятый anwer присутствует, я хотел бы добавить немного описания.

Давайте сделаем небольшое упражнение

, прежде всего определим класс следующим образом:

class A:
temp='Skyharbor'

def __init__(self, x):
    self.x=x
def change(self, y):
    self.temp=y

Итак, что мы имеем здесь?

  • У нас есть очень простой класс, который имеет атрибут temp, который является строкой
  • An init, который устанавливает self.x
  • . Метод изменения устанавливает self.temp

Довольно прямо вперед до сих пор? Теперь давайте начнем играть с этим классом. Давайте сначала инициализируем этот класс:

a = A('Tesseract')

Теперь сделайте следующее:

>>> print a.temp
Skyharbor
>>> print A.temp
Skyharbor

Ну, a.temp работал так, как ожидалось, но как, черт возьми, A.temp работал? Ну, это сработало, потому что temp - это атрибут класса. Все в python - это объект. Здесь A также является объектом класса type. Таким образом, temp атрибута является атрибутом, принадлежащим классу A, и если вы измените значение temp через A (а не через экземпляр a), измененное значение будет отражено во всем экземпляре класса A. Давайте продолжим и сделаем это:

>>> A.temp = 'Monuments'
>>> print A.temp
Monuments
>>> print a.temp
Monuments

Интересно, не так ли? И обратите внимание, что id (a.temp) и id (A.temp) все те же

Любой объект Python автоматически получает атрибут dict, который содержит его список атрибутов. Давайте рассмотрим, что этот словарь содержит для наших объектов-объектов:

>>> print A.__dict__
{
    'change': <function change at 0x7f5e26fee6e0>,
    '__module__': '__main__',
    '__init__': <function __init__ at 0x7f5e26fee668>,
    'temp': 'Monuments',
    '__doc__': None
}
>>> print a.__dict__
{x: 'Tesseract'}

Обратите внимание, что атрибут temp указан среди атрибутов класса A, тогда как x указан для экземпляра

Итак, что мы получаем определенное значение a.temp, если оно даже не указано для экземпляра a. Ну, это волшебство метода __getattribute__(). В Python точечный синтаксис автоматически вызывает этот метод, поэтому, когда мы пишем a.temp, Python выполняет a.getattribute ('temp'). Этот метод выполняет действие поиска атрибута, то есть находит значение атрибута, просматривая в разных местах.

Стандартная реализация __getattribute__() сначала ищет внутренний словарь (dict) объекта, а затем тип самого объекта. В этом случае a.__getattribute__('temp') выполняет сначала a.__dict__['temp'], а затем a.__class__.__dict__['temp']

Теперь давайте воспользуемся нашим методом change:

>>> a.change('Intervals')
>>> print a.temp
Intervals
>>> print A.temp
Monuments

Ну, теперь, когда мы использовали себя , print a.temp дает другое значение из print A.temp.

Теперь, если мы сравним id (a.temp) и id (A.temp), они будут разными

14
задан Brian Tompsett - 汤莱恩 24 August 2015 в 14:51
поделиться

7 ответов

Чтобы выпустить файл изображения после загрузки, вам необходимо создать свои изображения, установив флаг BitmapCacheOption.OnLoad. Один из способов сделать это:

string filename = ...
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filename);
image.EndInit();

Хотя установка BitmapCacheOption.OnLoad работает на BitmapImage, загружаемом из локального файла Uri, это не описано нигде. Поэтому, вероятно, лучше или безопаснее загружать изображение из FileStream, установив свойство StreamSource вместо UriSource:

string filename = ...
BitmapImage image = new BitmapImage();

using (var stream = File.OpenRead(filename))
{
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = stream;
    image.EndInit();
}
18
ответ дан Clemens 23 August 2018 в 22:04
поделиться

с моей точки зрения, общий ответ состоял в том, чтобы отменить объект, который сохраняет открытый процесс с файлом, который вы хотите удалить. В моем случае это MailMessage, но также может быть поток, filestream и т. Д., Которые вам нужно утилизировать.

0
ответ дан AlexSen 23 August 2018 в 22:04
поделиться

У меня была аналогичная проблема. Единственное различие заключалось в том, что я использовал Binding (MVVM Pattern). Ничего не получилось, я удалил все и попытался с Binding Mode=OneWay вместе с GC.Collect() перед вызовом File.Delete(path), и он работал наконец.

0
ответ дан Anup Sharma 23 August 2018 в 22:04
поделиться

Извините, мой плохой английский. Я надеюсь помочь:

var uploadedFile = Request.Files[0]; //Get file
var fileName = Path.GetFileName(uploadedFile.FileName);  //get file name
string fileSavePath = Server.MapPath(fileName); //get path
uploadedFile.SaveAs(fileSavePath); //saving file
FileInfo info = new FileInfo(fileSavePath);//get info file
//the problem ocurred because this, 
FileStream s = new FileStream(fileSavePath, FileMode.Open); //openning stream, them file in use by a process
System.IO.File.Delete(fileSavePath); //Generete a error
//problem solved here...
s.Close();
s.Dispose();
System.IO.File.Delete(fileSavePath); //File deletad sucessfully!
0
ответ дан Eduardo Sobrinho 23 August 2018 в 22:04
поделиться

У меня была такая же проблема. Проблема у меня была с openFileDialog и saveFileDialog, имеющими следующий набор:

MyDialog.AutoUpgradeEnabled = false;

Я прокомментировал эту строку и был разрешен.

0
ответ дан JeffS 23 August 2018 в 22:04
поделиться

это может быть проблема с сборкой мусора.

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 
File.Delete(picturePath);
71
ответ дан kplshrm7 23 August 2018 в 22:04
поделиться

Другой способ - удалить файл. Загрузите файл с помощью класса FileStream и выпустите файл через stream.Dispose (); он никогда не даст вам исключение «Процесс не может получить доступ к файлу», потому что он используется другим процессом. »

using (FileStream stream = new FileStream("test.jpg", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
     stream.Dispose();
}

 // delete your file.

 File.Delete(delpath);
5
ответ дан Shahid Manzoor 23 August 2018 в 22:04
поделиться
Другие вопросы по тегам:

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