Avatar billede timelord Nybegynder
10. marts 2011 - 15:30 Der er 14 kommentarer og
1 løsning

Får fejl npr jeg prøver at overskrive billede fil.

Jeg har en Winform hvor jeg henter et billede fra en fil og ind i en PictureBox og det virker fint.

Når jeg så vil opdatere mine oplysninger på formen spørger programmet om jeg vil overskrive den billede fil som jeg hentet.

Nu kommer mit problem så da jeg ikke får lov. Den skriver at filen allerede er i brug af en anden process.

Her er min kode: (nyTegningsNavn indeholder fil sti og filnavn)

pbEmneTegning.Image.Save(nyTegningsNavn);
pbEmneTegning.Dispose();

Filen skal skrives til serveren og der er rettighederne i orden for jeg får lov til at gemme filen hvis den ikke eksistere i forvejen.

Jeg har også prøvet at gemme filen under et anden navn og så bagefter prøve at kopiere den med FileInfo.CopyTo(), heller ikke det får jeg lov til.

Jeg er efterhånden ved at være gråhåret.
Avatar billede Syska Mester
10. marts 2011 - 15:55 #1
Hvordan læser du billedet første gang ?

mvh
Avatar billede timelord Nybegynder
10. marts 2011 - 17:23 #2
pbEemneTegning.Image = Image.FromFile(filSti);
Avatar billede Syska Mester
10. marts 2011 - 17:36 #3
Uden at være sikker, så tror jeg overstående holder en lock på den fil du vil overskrive.

Tror du skal fjerne den på en måde, og dispose det object. Det kan også ske at jeg tager fejl.

mvh
Avatar billede timelord Nybegynder
10. marts 2011 - 17:44 #4
Jeg har prøvet at lave en ny Image object og sætte den lig med pbEmneTegning og så lave pbEmneTegning.Dispose(). For derefter at gemme det nye image.

Men får samme fejl.
Kan godt gemme den under et andet navn, men får så ikke lov til at kopiere den ny over den gamle.
Avatar billede Syska Mester
10. marts 2011 - 17:51 #5
Hvis du kan lave et simpelt eksemple på problemet, så vil jeg se om jeg kan løse det ...

Men inden da kan det jo ske at vores kære "arne_v" kommer med en kommentar om hvad der eventuelt går galt.

Der er i hvert fald et eller andet der laver en lock :-)

mvh
Avatar billede timelord Nybegynder
10. marts 2011 - 18:00 #6
Jeg har vist sagt og vist det hele.

Har en winform med en PictureBox.
Læser billede ind ved at bruge PicTureBox.Image = File.ImageFromFile(Sti)
Prøver at gemme billede igen som PictureBox.Save.

Jeg er helt blank angående den process som har adgang til mit billede.
Avatar billede Syska Mester
10. marts 2011 - 18:06 #7
Nu var det mere for at jeg ikke skulle skrive det hele selv, hvis du allerede havde et eksemple som gav det problem du kunne dele.

Men jeg vil lige kigge på det.

mvh
Avatar billede timelord Nybegynder
10. marts 2011 - 18:52 #8
Form_Load henter data fra mySQL via klassen DB_Håndtering
Kode:
                DataTable dt = new DataTable();
                DataSet dsEmne = DB_Håndtering.VisEmne(mainForm.AktuelEmneID);
                dt = dsEmne.Tables[0];
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    txtID.Text = dt.Rows[i]["ID"].ToString();
                    txtEmneTekst.Text = dt.Rows[i]["EmneTekst"].ToString();
                    txtBearbejdningsTid.Text = dt.Rows[i]["BearbejdningsTid"].ToString();
                    if(dt.Rows[i]["EmneTegning"].ToString() != "")
                        pbEmneTegning.Image = Image.FromFile(dt.Rows[i]["EmneTegning"].ToString());
                    txtEmneNummer.Text = dt.Rows[i]["E,mneNummer"].ToString();
                    txtEmnePris.Text = dt.Rows[i]["EmnePris"].ToString();
                }


Knappen OpdaterEmne kalder denne kode:
                            //** Gem tegning først og generer fil navn
                            string nyTegningsNavn = @"v:\Dancoat\Produktionsstyring\EmneTegninger\" + txtEmneNummer.Text + ".jpg";

                            pbEmneTegning.Image.Save(nyTegningsNavn);
                            pbEmneTegning.Dispose();
                            VisEmnerForKunde.nyTegningsNavn = nyTegningsNavn;

                           
                            EmneFil = @"v:\Dancoat\Produktionsstyring\EmneTegninger\" + txtEmneNummer.Text + ".jpg";

                            DB_Håndtering.OpdaterEmne(int.Parse(txtID.Text), txtEmneTekst.Text, mainForm.AktuelKundeForEmneID, float.Parse(txtBearbejdningsTid.Text), EmneFil, txtEmneNummer.Text, float.Parse(txtEmnePris.Text));
                            this.Close();
Avatar billede aaberg Nybegynder
10. marts 2011 - 22:29 #9
Jeg prøvede at lave et eksempel, og ganske rigtig, der sker en fejl, når man først bruger Image.FromFile(), og derefter Image.Save().

Jeg løste det ved at kopiere indholdet af billedefilen til en memorystream, lukke FileStream'en, og bruge Image.FromStream til at åbne det med. Derefter virker Image.Save.

Se koden herunder:

MemoryStream memStream = new MemoryStream();

// åben fil
using (FileStream fileStream = File.OpenRead("c:\\temp\\eksperten_logo.gif"))
{
    //kopier til memorystream
    byte[] buffer = new byte[1024];
    int bytesRead;
    do
    {
        bytesRead = fileStream.Read(buffer, 0, buffer.Length);
        memStream.Write(buffer, 0, bytesRead);
    }
    while (bytesRead > 0);
}
// åben billede fra memoryStream.
this.pictureBox1.Image = Image.FromStream(memStream);

// Nu kan billedet gemmes
this.pictureBox1.Image.Save("c:\\temp\\eksperten_logo.gif");
Avatar billede Syska Mester
10. marts 2011 - 23:31 #10
Jeg fik den indikation at han allerede havde prøvet at gøre det uden om Image.FromFile(path), og at det stadig fejlede.

Men så har fejlen jo også være at Image.FromFile laver en lock, man ikke bare lige kan omgå.

MS har selv en artikel om det:
http://support.microsoft.com/kb/309482

Så det ser ud til at være eneste løsning.

mvh
Avatar billede timelord Nybegynder
11. marts 2011 - 09:52 #11
Jeg tror aaberg_cc mener at jeg skal prøve hans kode når jeg henter billedet ind i min Winform.
Avatar billede Syska Mester
11. marts 2011 - 09:58 #12
Ja, og mit link viser bare at det enten er en bug eller feature i .NET og hvordan du også kan løse det. Dog i VB.NET, men fremgangs måden er jo den samme i C#.

Og så er den måde MS beskriver vist et par linjer kortere.

mvh
Avatar billede timelord Nybegynder
11. marts 2011 - 10:06 #13
Jeg er først tilbage på kontoret på tirsdag så jeg kan ikke afprøve koden før.

Jeg vender tilbage når det er afprøvet.
Avatar billede timelord Nybegynder
15. marts 2011 - 08:42 #14
Det virker som en drøm.
Smid et svar!
Avatar billede aaberg Nybegynder
15. marts 2011 - 09:13 #15
svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester