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