dlaczego nie otwiera się plik?

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?

0

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

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?

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

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
				}
			}
		}
	}
}
0

Bardzo Ci dziękuję.

Zaraz postaram się to opanować.

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...

0

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

0

Okazuje sie, że to kwestia wczesniej otworzonego pliku.

Zamykam temat i dzięki za pomoc.

0

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

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Ć?

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