evagelos_21 Δημοσ. 1 Φεβρουαρίου 2012 Δημοσ. 1 Φεβρουαρίου 2012 γειά σας παιδιά, μέσα απο .net και c# έχω φτιάξει ένα πρόγραμμα και προσπαθώ να διαβάσω ένα αρχείο απο ένα φάκελο επειδή δεν θα είναι πάντα στον ίδιο φάκελο το αρχείο έχω ένα αρχείο "settings.ini" και εκεί έχω μια παράμετρο που του λέω που βρίσκεται το path το πρόβλημα είναι ότι όταν ο φάκελος έχει ελληνικό όνομα τότε δεν το καταλαβαίνει. Αυτό που γυρνάει είναι: C:\\Users\\vagelis\\���� και βέβαια μετά σκάει ini αρχείο: > [sPOOLER] VALUE=C:\Users\vagelis\λαλα > string path = Path.GetDirectoryName(Application.ExecutablePath) + "\\settings.ini"; IniParser parser = new IniParser(@path); spool = parser.GetSetting("SPOOLER", "VALUE"); MessageBox.Show(spool); και η IniParser: > using System; using System.IO; using System.Collections; public class IniParser { private Hashtable keyPairs = new Hashtable(); private String iniFilePath; private struct SectionPair { public String Section; public String Key; } /// <summary> /// Opens the INI file at the given path and enumerates the values in the IniParser. /// </summary> /// <param name="iniPath">Full path to INI file.</param> public IniParser(String iniPath) { TextReader iniFile = null; String strLine = null; String currentRoot = null; String[] keyPair = null; iniFilePath = iniPath; if (File.Exists(iniPath)) { try { iniFile = new StreamReader(iniPath); strLine = iniFile.ReadLine(); while (strLine != null) { strLine = strLine.Trim();//.ToUpper();*********************************** if (strLine != "") { if (strLine.StartsWith("[") && strLine.EndsWith("]")) { currentRoot = strLine.Substring(1, strLine.Length - 2); } else { keyPair = strLine.Split(new char[] { '=' }, 2); SectionPair sectionPair; String value = null; if (currentRoot == null) currentRoot = "ROOT"; sectionPair.Section = currentRoot; sectionPair.Key = keyPair[0]; if (keyPair.Length > 1) value = keyPair[1]; keyPairs.Add(sectionPair, value); } } strLine = iniFile.ReadLine(); } } catch (Exception ex) { throw ex; } finally { if (iniFile != null) iniFile.Close(); } } else throw new FileNotFoundException("Unable to locate " + iniPath); } /// <summary> /// Returns the value for the given section, key pair. /// </summary> /// <param name="sectionName">Section name.</param> /// <param name="settingName">Key name.</param> public String GetSetting(String sectionName, String settingName) { SectionPair sectionPair; sectionPair.Section = sectionName.ToUpper(); sectionPair.Key = settingName;//.ToUpper(); ************************* return (String)keyPairs[sectionPair]; } /// <summary> /// Enumerates all lines for given section. /// </summary> /// <param name="sectionName">Section to enum.</param> public String[] EnumSection(String sectionName) { ArrayList tmpArray = new ArrayList(); foreach (SectionPair pair in keyPairs.Keys) { if (pair.Section == sectionName.ToUpper()) tmpArray.Add(pair.Key); } return (String[])tmpArray.ToArray(typeof(String)); } /// <summary> /// Adds or replaces a setting to the table to be saved. /// </summary> /// <param name="sectionName">Section to add under.</param> /// <param name="settingName">Key name to add.</param> /// <param name="settingValue">Value of key.</param> public void AddSetting(String sectionName, String settingName, String settingValue) { SectionPair sectionPair; sectionPair.Section = sectionName.ToUpper(); sectionPair.Key = settingName.ToUpper(); if (keyPairs.ContainsKey(sectionPair)) keyPairs.Remove(sectionPair); keyPairs.Add(sectionPair, settingValue); } /// <summary> /// Adds or replaces a setting to the table to be saved with a null value. /// </summary> /// <param name="sectionName">Section to add under.</param> /// <param name="settingName">Key name to add.</param> public void AddSetting(String sectionName, String settingName) { AddSetting(sectionName, settingName, null); } /// <summary> /// Remove a setting. /// </summary> /// <param name="sectionName">Section to add under.</param> /// <param name="settingName">Key name to add.</param> public void DeleteSetting(String sectionName, String settingName) { SectionPair sectionPair; sectionPair.Section = sectionName.ToUpper(); sectionPair.Key = settingName.ToUpper(); if (keyPairs.ContainsKey(sectionPair)) keyPairs.Remove(sectionPair); } /// <summary> /// Save settings to new file. /// </summary> /// <param name="newFilePath">New file path.</param> public void SaveSettings(String newFilePath) { ArrayList sections = new ArrayList(); String tmpValue = ""; String strToSave = ""; foreach (SectionPair sectionPair in keyPairs.Keys) { if (!sections.Contains(sectionPair.Section)) sections.Add(sectionPair.Section); } foreach (String section in sections) { strToSave += ("[" + section + "]\r\n"); foreach (SectionPair sectionPair in keyPairs.Keys) { if (sectionPair.Section == section) { tmpValue = (String)keyPairs[sectionPair]; if (tmpValue != null) tmpValue = "=" + tmpValue; strToSave += (sectionPair.Key + tmpValue + "\r\n"); } } strToSave += "\r\n"; } try { TextWriter tw = new StreamWriter(newFilePath); tw.Write(strToSave); tw.Close(); } catch (Exception ex) { throw ex; } } /// <summary> /// Save settings back to ini file. /// </summary> public void SaveSettings() { SaveSettings(iniFilePath); } }
moukoublen Δημοσ. 1 Φεβρουαρίου 2012 Δημοσ. 1 Φεβρουαρίου 2012 > iniFile = new StreamReader(iniPath, Encoding.Default); Για δοκίμασε έτσι. Το πρόβλημα το έχεις στο αρχείο το path του οποίου διαβάζεις στο settings.ini έτσι; Εξαρτάται λοιπόν από το encoding του αρχείου ini. Κατά πάσα πιθανότητα είναι σε windows-1253. Οπότε για καλύτερο προσδιορισμό βάλε > iniFile = new StreamReader(iniPath, Encoding.GetEncoding("windows-1253")); αν το αρχείο είναι σε utf-8 τότε αυτό: > iniFile = new StreamReader(iniPath, Encoding.UTF8); Και μία πρόταση. Για αυτές τις καταστάσεις δε χρειάζεται να μπλέκεις με τα streams. Ειδικά άμα το αρχείο είναι μικρό. Δοκίμασε αυτό >string[] allFileLines = File.ReadAllLines(iniPath, Encoding.GetEncoding("windows-1253")); Σου επιστρέφει όλο το αρχείο σου (τις γραμμές του) σε πίνακα απο string
evagelos_21 Δημοσ. 1 Φεβρουαρίου 2012 Μέλος Δημοσ. 1 Φεβρουαρίου 2012 Ειμαστε οκ Εβαλα αυτό και έπαιξε: iniFile = new StreamReader(iniPath, Encoding.GetEncoding("windows-1253")); thanks
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα