Diskuze: Zápis do souboru
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Skús spustiť program, prípadne Visual Studio ako správca, mohlo by to
pomôcť. 
Štefan Pružinský:12.1.2016 17:42
Taktiež by sa zišiel väčší fragment kódu, v prvom rade ta práca s
FileStream... 
Když spustím jako správce, stále nefunguje.
celý soubor zde:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using System.Xml.Linq;
using System.Xml;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
namespace first_lunch_wp10
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class theGame : Page
    {
        public theGame()
        {
            this.InitializeComponent();
        }
        Words slova = new Words();
        public int score = 0;
        public string NahodneSlovo;
        Score MaxSkore = new Score();
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            NahodneSlovo = slova.VyberSlovo();
            char[] test = slova.pismena(NahodneSlovo);
            Letter1.Content = test[0];
            Letter2.Content = test[1];
            Letter3.Content = test[2];
            Letter4.Content = test[3];
            base.OnNavigatedTo(e);
        }
        public Stream GenerateStreamFromString(string s)
        {
            MemoryStream stream = new MemoryStream();
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(s);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }
        private void back_Click(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(MainPage));
        }
        private async void pauza_Click(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            pause.IsOpen = true;
            var dialog = new ContentDialog()
            {
                Title = "Pauza",
                //RequestedTheme = ElementTheme.Dark,
                //FullSizeDesired = true,
                MaxWidth = this.ActualWidth // Required for Mobile!
            };
            var panel = new StackPanel();
            panel.Children.Add(new TextBlock
            {
                Text = "Hra je pozastavena. \nVaše aktuální skóre je: " + aktSkore.Text,
                TextWrapping = TextWrapping.Wrap,
            });
            dialog.Content = panel;
            // Add Buttons
            dialog.PrimaryButtonText = "Pokračovat";
            dialog.SecondaryButtonText = "Ukončit";
            dialog.SecondaryButtonClick += delegate {
                if(Convert.ToInt32(aktSkore.Text) > Convert.ToInt32(MaxSkore.vypisSkore()))
                {
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Indent = true;
                    // Zápis skóre
                    using (FileStream soubor = File.Open("score.xml", FileMode.Append))
                    using (XmlWriter xw = XmlWriter.Create(soubor, settings))
                    {
                        xw.WriteStartDocument();
                        xw.WriteStartElement("score");
                        xw.WriteStartElement("skore", aktSkore.ToString());
                        xw.WriteEndElement();
                        xw.WriteEndElement(); // uzavření kořenového elementu
                        xw.WriteEndDocument(); // konec dokument
                        xw.Flush();
                    }
                }
                this.Frame.Navigate(typeof(MainPage));
            };
            var result = await dialog.ShowAsync();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            NahodneSlovo = slova.VyberSlovo();
            char[] test = slova.pismena(NahodneSlovo);
            Letter1.Content = test[0];
            Letter2.Content = test[1];
            Letter3.Content = test[2];
            Letter4.Content = test[3];
        }
        private void Letter1_Click(object sender, RoutedEventArgs e)
        {
            HadaneSlovo.Text += Letter1.Content.ToString();
            Letter1.Visibility = Visibility.Collapsed;
            if(HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
        private void Letter2_Click(object sender, RoutedEventArgs e)
        {
           HadaneSlovo.Text += Letter2.Content.ToString();
            Letter2.Visibility = Visibility.Collapsed;
            if (HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
        private void Letter3_Click(object sender, RoutedEventArgs e)
        {
            HadaneSlovo.Text += Letter3.Content.ToString();
            Letter3.Visibility = Visibility.Collapsed;
            if (HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
        private void Letter4_Click(object sender, RoutedEventArgs e)
        {
            HadaneSlovo.Text += Letter4.Content.ToString();
            Letter4.Visibility = Visibility.Collapsed;
            if (HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
    }
}Štefan Pružinský:12.1.2016 18:19
Skús vynechať ten FileStream, a ukladaj to priamo cez XmlWriter:
using (XmlWriter xw = XmlWriter.Create(@"file.xml"))Dúfam, že Ti to pomôže. 
Michal Štěpánek:12.1.2016 18:56
Soubor by měl být v nějakém adresáři, který je k tomu určený, např.: ProgramData a ne ve složce s programem...
Štefan Pružinský:12.1.2016 19:04
Vo väčšine prípadov (StreamWriter, HtmlTextWriter) sa to nachádza v zložke s programom, ale netvrdím, že to tak v istých prípadoch nemôže byť...
jt.e:12.1.2016 19:25
ten první kód je sice trochu podivný, ale k zápisu do souboru by mělo určitě dojít. Měl by ses zaměřit na to, proč do souboru nejde zapisovat (práva přístupu, blokování jiným procesem apd.). Co bych změnil určitě (teď to s tvým problémem nejspíš nesouvisí) je, že bych vždy předával plnou cestu k souboru.
smoukey:12.1.2016 19:29
Přesunutí do jiné složky nepomohlo, bohužel.
Když jsem vynechal Filestream, tak mi to píše chybu, viz. screen.
Michal Štěpánek:12.1.2016 19:29
Nevím, kde jsi přišel na takovou hloupost. Program je většinou nainstalován ve složce ProgramFiles, kde implicitně není nastaveno právo zápisu. K zápisu do různých souborů se právě používá adresář ProgramData (AppData)...
Michal Štěpánek:12.1.2016 19:31
Podívej se tady na webu na "práce se soubory a složkami" Program nezná cestu k programdata, musíš mu to napsat v jeho řeči. Nastuduj si "SpecialFolders"
Reoresents text as a series of Unicode characters. To browse the .NET Framework source code for this type, see the Reference Source.
Argument 1: cannot convert from 'string' to 'System.IO.Stream'
Screen není moc kvalitní, chyba, kterou to vypisuje je v citaci.
jt.e:12.1.2016 19:31
// Zápis skóre
            using (XmlWriter xw = XmlWriter.Create(File.Open("score.xml", FileMode.Append), settings))
            {
                xw.WriteStartDocument();
                xw.WriteStartElement("score");Složku pro zápis bych volil třeba takto:
string pth = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            string appdata_dir = Path.Combine(pth, "MujProgram");
            if (!Directory.Exists(appdata_dir)) Directory.CreateDirectory(appdata_dir);pak zapisoval:
string filename = Path.Combine(appdata_dir, "score.xml");
            // Zápis skóre
            using (XmlWriter xw = XmlWriter.Create(File.Open(filename, FileMode.Append), settings))smoukey:12.1.2016 19:45
Děkuji za kód, na internetu se v tom moc nevyznám  . každopádně mi to podtrhává
GetFolderPath a SpecialFolder
. každopádně mi to podtrhává
GetFolderPath a SpecialFolder
jt.e:12.1.2016 19:48
Umě to funguje na 100%
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
namespace Konzola11
{
    class Program
    {
        static void Main(string[] args)
        {
            string pth = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            string appdata_dir = Path.Combine(pth, "MujProgram");
            if (!Directory.Exists(appdata_dir)) Directory.CreateDirectory(appdata_dir);
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            string filename = Path.Combine(appdata_dir, "score.xml");
            // Zápis skóre
            using (XmlWriter xw = XmlWriter.Create(File.Open(filename, FileMode.Append), settings))
            {
                xw.WriteStartDocument();
                xw.WriteStartElement("score");
                xw.WriteStartElement("skore", "aktSkore");
                xw.WriteEndElement();
                xw.WriteEndElement(); // uzavření kořenového elementu
                xw.WriteEndDocument(); // konec dokument
                xw.Flush();
            }
            Console.ReadKey();
        }
    }
}soubor se zapsal do: C:\Users\UserName\AppData\Roaming\MujProgram
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using System.Xml.Linq;
using System.Xml;
using System.Text;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
namespace first_lunch_wp10
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class theGame : Page
    {
        public theGame()
        {
            this.InitializeComponent();
        }
        Words slova = new Words();
        public int score = 0;
        public string NahodneSlovo;
        Score MaxSkore = new Score();
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            NahodneSlovo = slova.VyberSlovo();
            char[] test = slova.pismena(NahodneSlovo);
            Letter1.Content = test[0];
            Letter2.Content = test[1];
            Letter3.Content = test[2];
            Letter4.Content = test[3];
            base.OnNavigatedTo(e);
        }
        public Stream GenerateStreamFromString(string s)
        {
            MemoryStream stream = new MemoryStream();
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(s);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }
        private void back_Click(object sender, RoutedEventArgs e)
        {
            this.Frame.Navigate(typeof(MainPage));
        }
        private async void pauza_Click(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            pause.IsOpen = true;
            var dialog = new ContentDialog()
            {
                Title = "Pauza",
                //RequestedTheme = ElementTheme.Dark,
                //FullSizeDesired = true,
                MaxWidth = this.ActualWidth // Required for Mobile!
            };
            var panel = new StackPanel();
            panel.Children.Add(new TextBlock
            {
                Text = "Hra je pozastavena. \nVaše aktuální skóre je: " + aktSkore.Text,
                TextWrapping = TextWrapping.Wrap,
            });
            dialog.Content = panel;
            // Add Buttons
            dialog.PrimaryButtonText = "Pokračovat";
            dialog.SecondaryButtonText = "Ukončit";
            dialog.SecondaryButtonClick += delegate {
                if(Convert.ToInt32(aktSkore.Text) > Convert.ToInt32(MaxSkore.vypisSkore()))
                {
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Indent = true;
                    string pth = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
                    string appdata_dir = Path.Combine(pth, "first_lunch_wp10/programData");
                    if (!Directory.Exists(appdata_dir)) Directory.CreateDirectory(appdata_dir);
                    // Zápis uživatelů
                    string filename = Path.Combine(appdata_dir, "score.xml");
                    // Zápis skóre
                    using (XmlWriter xw = XmlWriter.Create(File.Open(filename, FileMode.Append), settings))
                    {
                        xw.WriteStartDocument();
                        xw.WriteStartElement("score");
                        xw.WriteStartElement("skore", aktSkore.ToString());
                        xw.WriteEndElement();
                        xw.WriteEndElement(); // uzavření kořenového elementu
                        xw.WriteEndDocument(); // konec dokument
                        xw.Flush();
                    }
                }
                this.Frame.Navigate(typeof(MainPage));
            };
            var result = await dialog.ShowAsync();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            NahodneSlovo = slova.VyberSlovo();
            char[] test = slova.pismena(NahodneSlovo);
            Letter1.Content = test[0];
            Letter2.Content = test[1];
            Letter3.Content = test[2];
            Letter4.Content = test[3];
        }
        private void Letter1_Click(object sender, RoutedEventArgs e)
        {
            HadaneSlovo.Text += Letter1.Content.ToString();
            Letter1.Visibility = Visibility.Collapsed;
            if(HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
        private void Letter2_Click(object sender, RoutedEventArgs e)
        {
           HadaneSlovo.Text += Letter2.Content.ToString();
            Letter2.Visibility = Visibility.Collapsed;
            if (HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
        private void Letter3_Click(object sender, RoutedEventArgs e)
        {
            HadaneSlovo.Text += Letter3.Content.ToString();
            Letter3.Visibility = Visibility.Collapsed;
            if (HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
        private void Letter4_Click(object sender, RoutedEventArgs e)
        {
            HadaneSlovo.Text += Letter4.Content.ToString();
            Letter4.Visibility = Visibility.Collapsed;
            if (HadaneSlovo.Text.Length == 4)
            {
                if (HadaneSlovo.Text == NahodneSlovo.Trim())
                {
                    score++;
                    aktSkore.Text = score.ToString();
                    NahodneSlovo = slova.VyberSlovo();
                    char[] test = slova.pismena(NahodneSlovo);
                    Letter1.Content = test[0];
                    Letter2.Content = test[1];
                    Letter3.Content = test[2];
                    Letter4.Content = test[3];
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                    HadaneSlovo.Text = "";
                }
                else
                {
                    HadaneSlovo.Text = "";
                    Letter1.Visibility = Visibility.Visible;
                    Letter2.Visibility = Visibility.Visible;
                    Letter3.Visibility = Visibility.Visible;
                    Letter4.Visibility = Visibility.Visible;
                }
            }
        }
    }
}Takto vypadá celý soubor, ale podtrhává mi to GetFolderPath *a *SpecialFolder
Michal Štěpánek:12.1.2016 20:02
A jaké možnosti ti to nabízí, když na to najedeš myší?
jt.e:12.1.2016 20:04
To je nesmysl, je to podporované od Frameworku 1.1
https://msdn.microsoft.com/…vs.110).aspx
Tam musíš mít blbě něco v nastavení projektu. Co to vypisuje? Že to nezná?
smoukey:12.1.2016 20:10
Severity Code Description Project File Line Suppression State
Error CS0117 'Environment' does not contain a definition for 'GetFolderPath' first_lunch_wp10 C:\Users\Jan\Documents\Visual Studio 2015\Projects\first_lunch_wp10\first_lunch_wp10\theGame.xaml.cs 93 Active
Severity Code Description Project File Line Suppression State
Error CS0117 'Environment' does not contain a definition for 'SpecialFolder' first_lunch_wp10 C:\Users\Jan\Documents\Visual Studio 2015\Projects\first_lunch_wp10\first_lunch_wp10\theGame.xaml.cs 93 Active
smoukey:12.1.2016 20:17
Díky za to lomítko, nicméně nic se nezměnilo 
No měla by to být univerzální aplikace
jt.e:12.1.2016 20:22
no tak to je ještě lepší..
Jak je něco univerzální tak to stojí za ho..
(lomítko se používá většinou zpětné, ale kompilátor to asi opraví)
možná toto ti pomůže:
https://msdn.microsoft.com/…t188700.aspx
Štefan Pružinský:12.1.2016 20:38
Vyskúšaj si to, hádať sa s tebou nebudem. 
Štefan Pružinský:12.1.2016 20:41
Edit: Nevšimol som si, že uvádzaš správnu praktiku, nie defaultne nastavenie. Ospravedlňujem sa za omyl.
ostrozan:12.1.2016 20:55
Já jsem měl s tím taky problém, i když ve starším VS - pomohl až celý výpis:
System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "my folder");a to i přesto,že
using System.IO.;jest přítomen 
ale to bylo myslím VS2010 , tak nevím, jestli ti to pomůže
jt.e:12.1.2016 21:07
S univerzálními aplikacemi nemám žádnou zkušenost, ale podle toho co jsem hledal na netu, tak by se mělo používat pro práci se soubory v univer. aplikaci Windows.Storage StorageFile a StorageFolder
Zobrazeno 28 zpráv z 28.
 
				



 
										