• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Brak możliwości nadpisania tymczasowego zdjęcia w programie C#

Object Storage Arubacloud
0 głosów
138 wizyt
pytanie zadane 12 marca w C# przez przybylanikodem Nowicjusz (120 p.)
zamknięte 14 marca przez przybylanikodem
Program to fotobudka.
Problem polega na tym ze program po zrobieniu kolejnych zdjęć nie może nadpisać tymczasowego zdjęcia w lokalizacji, w której ma prawa zapisu.
 

[ WARN:0@7.015] global loadsave.cpp:759 cv::imwrite_ imwrite_('C:\Users\***\AppData\Local\Temp\temp_photo.jpg'): can't open file for writing: permission denied
komentarz zamknięcia: rozwiazalem juz problem
komentarz 12 marca przez adrian17 Ekspert (345,620 p.)
Pokażesz kod?

Nie jest możliwe że np ten plik już masz otwarty gdzie indziej?
komentarz 12 marca przez przybylanikodem Nowicjusz (120 p.)
Cełego kodu jest za dużo żeby pokazywać, pokaze urywek gdzie zapisuje zdjecie i przekazuje do kolejnego forma. I nie ma opcji ze plik jest otwarty gdzie indziej.
 

private async void ButtonZdj_Click(object sender, EventArgs e)
{
    buttonBack.Enabled = false;
    buttonZdj.Enabled = false;
    countdownSeconds = 5;

    for (int i = 2; i > 0; i--)
    {
        countdownLabel.BringToFront();
        countdownLabel.Text = i.ToString();
        await Task.Delay(1000);
    }

    countdownLabel.Text = "";

    if (currentFrame != null)
    {
        tempFilePath = Path.Combine(Path.GetTempPath(), @"C:\Users\Nikodem\source\repos\Fotobudka 1.3\temp_photo.jpg");
        currentFrame.SaveImage(tempFilePath);
        stop.Stop();
        form4 = new podglad();
        form4.SetForm1Reference(this);
        form4.SetTemporaryPhotoPath(tempFilePath);
        form4.Bounds = Screen.PrimaryScreen.Bounds;
        form4.BringToFront();
        form4.Show();
        buttonZdj.Enabled = true;
        buttonBack.Enabled = true;
        Dispose();
        this.Close();
    }

}
komentarz 12 marca przez adrian17 Ekspert (345,620 p.)
        form4 = new podglad();
        form4.SetForm1Reference(this);
        form4.SetTemporaryPhotoPath(tempFilePath);

 I nie ma opcji ze plik jest otwarty gdzie indziej.

A ten podglad... nie otwiera pliku?

komentarz 12 marca przez przybylanikodem Nowicjusz (120 p.)
Otwiera ale gdy ma byc nadpisany, form podglad ma zwolniane zasoby i jest zamykany
komentarz 12 marca przez adrian17 Ekspert (345,620 p.)
I tak - dla pewności, sprawdź co się stanie jak nie otworzysz tego do podglądu.
komentarz 12 marca przez przybylanikodem Nowicjusz (120 p.)
program jest tak zrobiony ze po zrobieniu zdjecia przechodzi sam do podgladu
1
komentarz 12 marca przez adrian17 Ekspert (345,620 p.)
No ok, ale powtórzę - spróbuj na chwilę zmienić, żeby podgląd nie otwierał tego pliku, albo nawet otwierał inny plik - wtedy zobaczysz, czy to przeszkadza w zapisaniu następnego.

Poza tym pomysłem, to na ślepo nie jestem w stanie nic więcej zasugerować.
komentarz 12 marca przez przybylanikodem Nowicjusz (120 p.)
Nie przeszkadza, podglad nie przeszkadza, moze zle zamykam lub zwalniam zasoby w funkcji powyzej
komentarz 13 marca przez VBService Ekspert (254,490 p.)
edycja 13 marca przez VBService

Możesz sprawdzić do czego odnosi się w tym kontekście this

System.Diagnostics.Debug.WriteLine(this.GetType().ToString());

MessageBox.Show(this.GetType().ToString());
if (currentFrame != null)
    {
        tempFilePath = Path.Combine(Path.GetTempPath(), @"C:\Users\Nikodem\source\repos\Fotobudka 1.3\temp_photo.jpg");
        currentFrame.SaveImage(tempFilePath);
        stop.Stop();

        System.Diagnostics.Debug.WriteLine(this.GetType().ToString());

        form4 = new podglad();
        form4.SetForm1Reference(this);
        form4.SetTemporaryPhotoPath(tempFilePath);
        form4.Bounds = Screen.PrimaryScreen.Bounds;
        form4.BringToFront();
        form4.Show();
        buttonZdj.Enabled = true;
        buttonBack.Enabled = true;
        Dispose();
        this.Close();
    }

 

AFAIK wywołanie w tym miejscu Dispose()

if (currentFrame != null)
    {
        ...
        Dispose();
        this.Close();
    }

nie odnosi się wcale do form4 jeśli ten kod jest wykonywany z innej form niż form4.

 

IMO kontrolka, która znajduje się na form4, do której jest ładowany obrazek, nie zwalnia uchwytu (handle) do pliku obrazka.

 form4.SetTemporaryPhotoPath(tempFilePath);

 

BTW,  How do I get the list of open file handles by process in C#?

komentarz 14 marca przez przybylanikodem Nowicjusz (120 p.)
Dzieki za odpowiedzi problem rozwiazany, zapisalem w memorystream, i przekazuje bitmape bezposrednio do funkcji do ktorych potrzebuje

Podobne pytania

0 głosów
1 odpowiedź 258 wizyt
pytanie zadane 29 lipca 2016 w C# przez Tomek Krupa Użytkownik (820 p.)
0 głosów
2 odpowiedzi 760 wizyt
pytanie zadane 17 listopada 2015 w Rozwój zawodowy, nauka, praca przez criss Mędrzec (172,590 p.)
0 głosów
0 odpowiedzi 167 wizyt

92,661 zapytań

141,557 odpowiedzi

319,999 komentarzy

62,028 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...