dlaczego nie otwiera się plik?

Odpowiedz Nowy wątek
2011-08-26 09:33
john
0

Poniżej kod zapisujący do Xml:

public void ZapiszDoXml(List<zbiorbuttonow> do_zapisu, string z)
{
SaveFileDialog nowyplik = new SaveFileDialog();
nowyplik.ShowDialog();//wyświetl okienko dialogowe
nowyplik.Filter = "XML Doc|*.xml";
nowyplik.Title = "XML";

        FileInfo fileInfo = new FileInfo(z);

Niestety w tym momencie program nie otwiera pliku:
FileStream fileStream = new FileStream(z, FileMode.Open);

        BinaryReader binaryReader = new BinaryReader(fileStream);
        byte[] data = binaryReader.ReadBytes((int)fileInfo.Length);

        XmlWriter xmlWriter = XmlWriter.Create(nowyplik.FileName);
        XmlSerializer zapisywacz = new XmlSerializer(typeof(List<ZbiorButtonow>));

        if (nowyplik.FileName != "")
        {
            xmlWriter.WriteStartDocument();
            xmlWriter.WriteStartElement("Obraz binarny");
            xmlWriter.WriteBase64(data, 0, data.Length);

            zapisywacz.Serialize(xmlWriter, do_zapisu);
            xmlWriter.WriteEndElement();
            xmlWriter.WriteEndDocument();
            xmlWriter.Close();
        }

    }

Zapis listy -działa. Problem jest, gdy próbuję otworzyć obraz z podanej lokalizacji.

W programie użytkownik wybiera obraz z komputera, obraz się otwiera, a potem chcę go zapisać.
Czy powodem niemożliwości zapisu jest to, że użytkownik wcześniej otworzył obraz?
Jak poprawić kod?

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-08-26 09:36
john
0

zapomniałam dodać, że ścieżka do otwarcie pliku jest poprawna

Pozostało 580 znaków

2011-08-26 09:56
0

Ale o co chodzi?
Czemu ustawiasz filtry po pokazaniu dialogu?
Poza tym wszystko źle. Aż mi się nie chce tłumaczyć. Złe użycie save dialogu, nie zamykane strumienie. Czy plik z w ogóle istnieje? I co znaczy nie otwiera? Jakiś wyjątek czy inny błąd?

Pozostało 580 znaków

2011-08-26 10:04
john
0

Jestem osobą początkującą, więc proszę o troszkę wyrozumiałości. Plik "z" istnieje. W momencie natrafienia na tą linijkę z jego odczytem przerywane jest dalsze wykonywanie zapisu...

A wszystko nie może być źle, bo listę zapisuje po zakomentowaniu próby zapisu obrazka

Ładnie Cię proszę o pomoc

Pozostało 580 znaków

2011-08-26 10:31
0

Tak powinno jakieś sensowne minimum wyglądać:

public void ZapiszDoXml(List<ZbiorButtonow> do_zapisu, string z)
{
    SaveFileDialog nowyplik = new SaveFileDialog();
    nowyplik.Filter = "XML Doc|*.xml";
    nowyplik.Title = "XML";
    if (nowyplik.ShowDialog() == DialogResults.OK) // to znaczy że user kliknął OK, a nie Anuluj na dialogu
    {
        FileStream fileStream = null;
        BinaryReader binaryReader = null;
        byte[] data = null;
        if (System.IO.File.Exists(x))
        {
            try
            {
                fileStream = new FileStream(z, FileMode.Open);
                binaryReader = new BinaryReader(fileStream);
                data = binaryReader.ReadBytes((int)fileInfo.Length);
            }
            catch
            {
                MessageBox.Show("Problem z otwarciem obrazka. Zapis przerwany");
                return;
            }
            finally
            {
                if (binaryReader != null) binaryReader.Close();
                if (fileStream != null) fileStream.Close();
            }
        }
 
        if (!string.IsNullOrEmpty(nowyplik.FileName) && data != null)
        {
            XmlWriter xmlWriter = null;
            try
            {
                XmlSerializer zapisywacz = new XmlSerializer(typeof(List<ZbiorButtonow>));
 
                xmlWriter = XmlWriter.Create(nowyplik.FileName);
                xmlWriter.WriteStartDocument();
                xmlWriter.WriteStartElement("Obraz binarny");
                xmlWriter.WriteBase64(data, 0, data.Length);
 
                zapisywacz.Serialize(xmlWriter, do_zapisu);
 
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndDocument();
            }
            catch
            {
                MessageBox.Show("Błąd podczas zapisu pliku.");
            }
            finally
            {
                if (xmlWriter != null)
                {
                    xmlWriter.Close();
                    System.IO.File.Delete(nowyplik.FileName); // może warto usunąć błędny plik
                }
            }
        }
    }
}
edytowany 1x, ostatnio: massther, 2011-08-26 10:31

Pozostało 580 znaków

2011-08-26 10:33
john
0

Bardzo Ci dziękuję.

Zaraz postaram się to opanować.

Pozostało 580 znaków

2011-08-26 11:00
john
0

kod rozumiem, ale okazuje się, że poniższy fragment nie działa (nawet, gdy wpiszę lokalizacje istniejącego pliku z ręki)

nie rozumiem skąd to się wzięło...

Pozostało 580 znaków

2011-08-26 11:03
john
0

try
{
fileStream = new FileStream(z, FileMode.Open);
binaryReader = new BinaryReader(fileStream);
data = binaryReader.ReadBytes((int)fileInfo.Length);
}

Pozostało 580 znaków

2011-08-26 11:53
john
0

Okazuje sie, że to kwestia wczesniej otworzonego pliku.

Zamykam temat i dzięki za pomoc.

Pozostało 580 znaków

2011-08-26 12:44
0

ZAPAMIĘTAJ: Nie zamknięte strumienie się mszczą! :)

Pozostało 580 znaków

2011-08-30 09:25
ali
0

Poproszę i ja w tym wątku o pomoc.

public void ZapiszDoXml(List<zbiorbuttonow> do_zapisu, string z)
{
SaveFileDialog nowyplik = new SaveFileDialog();
nowyplik.Filter = "XML Doc|*.xml";
nowyplik.Title = "XML";
if (nowyplik.ShowDialog() == DialogResult.OK)//zmieniono
{
FileStream fileStream = null;
BinaryReader binaryReader = null;
FileInfo fileInfo = null;//zmieniono
byte[] data = null;

            XmlWriter xmlWriter = XmlWriter.Create(nowyplik.FileName);
            XmlSerializer zapisywacz = new XmlSerializer(typeof(List<ZbiorButtonow>));

            if (File.Exists(z))
            {
                try
                {
                    pictureBox1.Image = null;

                    fileStream = new FileStream(z, FileMode.Open);
                    binaryReader = new BinaryReader(fileStream);
                    fileInfo = new FileInfo(z);//dodano
                    data = binaryReader.ReadBytes((int)fileInfo.Length);

                    xmlWriter.WriteStartDocument();

                    xmlWriter.WriteStartElement("Obraz");
                    xmlWriter.WriteBase64(data, 0, data.Length);

                    zapisywacz.Serialize(xmlWriter, do_zapisu);
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndDocument();
                    xmlWriter.Close();

                    Usun();
                    MessageBox.Show("Dane zostały poprawnie zapisane", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch
                {
                    MessageBox.Show("Błąd w trakcie zapisu", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                finally
                {
                    if (binaryReader != null) binaryReader.Close();
                    if (fileStream != null) fileStream.Close();
                    fi2.Delete();
                }
            }
        }
    }

Powyżej zamieściłem zapis, który działa poprawnie, ale mam problem z odczytem.

#region Odczyt danych z pliku

    public void OdczytZXml()
    {
        OpenFileDialog plik = new OpenFileDialog();
        plik.Filter = "XML Doc|*.xml";
        plik.Title = "XML";
        plik.ShowDialog();
        if (plik.FileName != "")
        {
            try
            {
                TextReader textReader = new StreamReader(plik.FileName);
                XmlSerializer deserializer = new XmlSerializer(typeof(List<ZbiorButtonow>));

                TU MA SIĘ ZNALEŹĆ ODCZYT ZAPISANEGO OBRAZKA

                B = (List<ZbiorButtonow>)deserializer.Deserialize(textReader);
                textReader.Close();
                MessageBox.Show("Dane zostały poprawnie odczytane", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch //(Exception e2)
            {
                MessageBox.Show("Błąd w trakcie odczytu", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            finally
            { 

            }
        }
    }

CZY KTOŚ MOŻE COŚ PODPOWIEDZIEĆ?

Ja mogę powiedzieć, że znaczniki <code> dużo lepiej wyróżnią twój kod, niż używanie caps locka. - aurel 2011-08-31 12:12

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0