• 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#

0 głosów
426 wizyt
pytanie zadane 12 marca 2024 w C# przez przybylanikodem Nowicjusz (120 p.)
zamknięte 14 marca 2024 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 2024 przez adrian17 Mentor (354,120 p.)
Pokażesz kod?

Nie jest możliwe że np ten plik już masz otwarty gdzie indziej?
komentarz 12 marca 2024 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 2024 przez adrian17 Mentor (354,120 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 2024 przez przybylanikodem Nowicjusz (120 p.)
Otwiera ale gdy ma byc nadpisany, form podglad ma zwolniane zasoby i jest zamykany
komentarz 12 marca 2024 przez adrian17 Mentor (354,120 p.)
I tak - dla pewności, sprawdź co się stanie jak nie otworzysz tego do podglądu.
komentarz 12 marca 2024 przez przybylanikodem Nowicjusz (120 p.)
program jest tak zrobiony ze po zrobieniu zdjecia przechodzi sam do podgladu
1
komentarz 12 marca 2024 przez adrian17 Mentor (354,120 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 2024 przez przybylanikodem Nowicjusz (120 p.)
Nie przeszkadza, podglad nie przeszkadza, moze zle zamykam lub zwalniam zasoby w funkcji powyzej
komentarz 13 marca 2024 przez VBService Ekspert (256,600 p.)
edycja 13 marca 2024 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 2024 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ź 477 wizyt
pytanie zadane 29 lipca 2016 w C# przez Tomek Krupa Użytkownik (820 p.)
0 głosów
2 odpowiedzi 968 wizyt
pytanie zadane 17 listopada 2015 w Rozwój zawodowy, nauka, praca przez criss Mędrzec (172,570 p.)
0 głosów
0 odpowiedzi 191 wizyt

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...