Laden...

Einfache Textdatei einlesen und wieder schreiben

Erstellt von Peter Bucher vor 18 Jahren Letzter Beitrag vor 18 Jahren 10.080 Views
Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren
Einfache Textdatei einlesen und wieder schreiben

Hallo

Ich möchte schlussendlich eine Datei per Drag & Drop auf die Exe ziehen können.
Intern wird dann der Inhalt ausgelesen und bearbeitet (Syntaxhervorhebung, tags etc..) und danach soll das ganze in eine .html File geschrieben werden.

Nun, musste frisch anfangen, weil ich jetzt im Geschäft bin.

Das Problem ist, wenn ich die Exe mit Argument (also eine Datei reinziehe das ich den Pfad & Dateinamen bekomme) aufrufe, schreibt er mir keine ouput.html File.

Wird nur die Exe Datei aufgerufen, schreibt er mir die Output.html, wieso das?

edit: Das WriteTextFile(); sollte ja sovieso ausgeführt werden, ist ja in keiner if() Bedingung... das Console.ReadLine() wird ja auch immer ausgeführt.


using System;
using System.IO;

namespace SyntaxWriter
{
	/// <summary>
	/// Zusammenfassung für Class1.
	/// </summary>
	class Class1
	{
		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			if(args.GetUpperBound(0) == 0) {
				Console.WriteLine(args[0]);
				Console.WriteLine(ReadTextFile(args[0]));
			}
			WriteTextFile();
			Console.ReadLine();
		}

		static void WriteTextFile() {
			StreamWriter sw = File.CreateText("output.html");
			sw.WriteLine("test");
			sw.Close();
		}

		static string ReadTextFile(string s_path) {
            string output;			
			StreamReader sr = new StreamReader(s_path);
			output = sr.ReadToEnd();
			return output;
		}
	}
}

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Peter Bucher,

die Abfrage ist verkehrt. Mag sein, dass das auch dein Problem löst, denn durch die falsche Abfrage können Exceptions entstehen. Muss heißen

if(args.GetUpperBound(0) != 0) {

oder noch besser

if(args.Length != 0) {

herbivore

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Hallo Herbovire

Also "if(args.Length != 0) {" funktioniert gut, hat vorher aber auch funktioniert... weil ich einen String Array mit einem Eintrag hatte, d.h. args[0] beinhaltet den Eintrag...

Ist xyz.Length nicht für Strings gedacht?

Das Problem das die output.txt nicht geschrieben wird, ist immer noch offen. 🙁

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
1.047 Beiträge seit 2005
vor 18 Jahren

beide klassen bzw. typen haben ein length attribut...

in dem fall gibt args.Length die länge des arrays args zurück...
wenn args[0]!=null ist, dann würde dir args[0].Length die länge des strings zurück geben

gibst du keinen parameter an, ist args.length0 wahr, gibts du ein argument an ist args.length1 wahr... usw.

d.h. du müßtest den code so umbauen


if(args.Length > 1) {
  Console.WriteLine("Zu viele Parameter...");
} else {
  if(args.Length == 1) {
    Console.WriteLine(args[0]);
    Console.WriteLine(ReadTextFile(args[0]));
  }
  WriteTextFile();
  Console.ReadLine();
}

bzw. falls du den fall mit den zuvielen parametern nicht abfangen willst


if(args.Length > 0) {
    Console.WriteLine(args[0]);
    Console.WriteLine(ReadTextFile(args[0]));
}
WriteTextFile();
Console.ReadLine();

p.s. fehlerhandhabung (Datei nicht da etc.) nicht vergessen 😉

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Danke für die Informationen, leider bringt mich das bei meinem Hauptproblem nicht weiter.

Vielleicht hab ich mich ein bisschen undeutlich verständigt.

Probiert mein Beispiel bitte einmal aus.
Wenn man sie einfach so startet, dann schreibt sie eine ouput.html, wenn man aber per Drag&Drop eine Textdatei öä. auf die Exe zieht, schreibt er keine output.html.

Wo ist da das Problem?

Das zweite Problem ist dann noch, ich lese den Inhalt (samt "\n"?) einer ganzen Textdatei ein (z. B. eine .asp Datei) ein und möchte dieses in eine neue Datei schreiben, dann schreibt er nichts (Ich benutze sr.Write()😉

Gruss Peter Bucher


using System;
using System.IO;

namespace SyntaxWriter
{
	/// <summary>
	/// Zusammenfassung für Class1.
	/// </summary>
	class Class1
	{
		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			if(args.Length != 0) {
				Console.Write("args fired!");
				Console.WriteLine(args[0]);
				Console.WriteLine(ReadTextFile(args[0]));
			}
			Console.WriteLine("Write fired!");
			WriteTextFile();
			Console.ReadLine();
		}

		static void WriteTextFile() {
			StreamWriter sw = File.CreateText("output.html");
			sw.WriteLine("test"); // Testeshalber
			sw.Close();
		}

		static string ReadTextFile(string s_path) {
            string output;			
			StreamReader sr = new StreamReader(s_path);
			output = sr.ReadToEnd();
			return output;
		}
	}
}

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
1.047 Beiträge seit 2005
vor 18 Jahren

zu deinem 1. problem:
such mal auf der platte nach der datei... problem ist nämlich, was für ein arbeitsverzeichnis hast du^^

edit:
schau mal auf c:\ 😉

zu deinem 2. problem:
wie sieht der code aus? oder ist das ein problem bei dem hier?

ich probier jetzt aber mal dein programm aus

edit: geht soweit alles...

19 Beiträge seit 2005
vor 18 Jahren

Wenn er die Datei per D&D auf die .exe zieht, müsste doch eigentlich der absolute Pfad der Datei übergeben werden, oder nich ? Also sollte das Arbeitsverzeichnis irrelevant sein.

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Hallo sheitmann

Hilft mir leider gar nichts... die Datei wird ja geschrieben und zwar ins Projektverzeichniss, quasi dort wo die Exe ist...

Probiers einfach mal aus.

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
1.047 Beiträge seit 2005
vor 18 Jahren

ja, für das lesen schon, aber nicht für das schreiben


static void WriteTextFile() {
  StreamWriter sw = File.CreateText("output.html");
  sw.WriteLine("test"); // Testeshalber
  sw.Close();
}

beim D&D hat der die output.html bei mir auf c:\ angelegt

wenn er die datei in den gleichen ordner wie die eingangsdatei haben will, muß er den pfad entsprechend anpassen...

19 Beiträge seit 2005
vor 18 Jahren

Hmm, bei mir nicht.

S
1.047 Beiträge seit 2005
vor 18 Jahren

Original von Peter Bucher
Hallo sheitmann

Hilft mir leider gar nichts... die Datei wird ja geschrieben und zwar ins Projektverzeichniss, quasi dort wo die Exe ist...

Probiers einfach mal aus.

wie ich schon geschrieben habe, legt er beim einfachen aufrufen der exe die output.html in das verzeichnis der exe datei, also in dem fall dein ausgabeverzeichnis vom projekt

rufst du die anwendung auf indem du per drag and drop eine datei auf die exe schiebst, dann wird die datei unter c:\output.html erstellt

das problem ist, das du bei erstelle nder datei mit

StreamWriter sw = File.CreateText("output.html");

nur den dateinamen angibst, aber kein verzeichnis...

dadurch wird die datei in das aktuelle ausgabeverzeichnis bzw. arbeitsverzeichnis geschrieben, und das scheint nicht der ordner zu sein, indem die exe liegt... zumindest nicht bei mir

ich hab es ausprobiert btw.

19 Beiträge seit 2005
vor 18 Jahren

Ja, eben. Bei mir nicht. Ich suche grade auch noch nach der Datei.

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Beim D&D wurde mir auch bei c:\ nichts angelegt.

Der Code hab ich daheim... wie müsste den der Pfad angegeben sein... sollte der Pfad der Exe sein.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

6.862 Beiträge seit 2003
vor 18 Jahren

Habs auch mal probiert. Bei mir war se im Userverzeichnis 😉 also C:\Dokumente und Einstellungen\Username. Aber das kannst du ja steuern. In der Environment Kasse gibts nen entsprechendes Property.

Baka wa shinanakya naoranai.

Mein XING Profil.

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Bei mir wars auch dort.
Wie heisst den die Property? Hab nichts entsprechendes gefunden.

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

A
452 Beiträge seit 2005
vor 18 Jahren

property = eigenschaft 😉

gugg mal nach currentdirectory

Signatur:
Die Signatur wird unter Ihren Beiträgen dargestellt.

😁 😮 ?( 8) 😭 8o :] 🙁 =) X( 🙂 😜 😉 :rolleyes: 👶 :evil: 👅
Smilies find ich doof =]

S
1.047 Beiträge seit 2005
vor 18 Jahren

damit setzt du das ausgabeverzeichnis/arbeitsverzeichnis zu dem verzeichnis wo deine exe liegt


Environment.CurrentDirectory = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Property = Eigenschaft... klar 😉
Danke sheitmann, dies funktioniert!

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Was muss ich für ein Encoding setzen, damit der Internet Explorer ASP Code darstellt, nicht nur im Quellcode.

Habs auch schon mit <pre> rundum probiert, nützte auch nichts... dann nehme ich mal an, es liegt an der Encoding.

Wie könnte es funktionieren?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
1.047 Beiträge seit 2005
vor 18 Jahren

also wenn ich mir den quelltext vo ndem forum hier anschau, dann haben die den quellcode in <code></code> tags gepackt... probier mal...

edit:
hm... irgendwie seltsam... geht nicht so richtig

pre müßte aber eigentlich funktionieren 😕

edit2:
ansonsten kannst du natürlich deinen ganzen code in eine html-datei umwandeln...

was du machen mußt ist:

  • alle html zeichen im quellcode durch die entsprechenden html-codierung ersetzen, zB. für <, >, & etc. (in php gibts da ne htmlentities funktion)
  • alle zeilenumbrüche durch <br /> ersetzen
  • alle einrückungen, am besten tabs, durch &nbsp; ersezten

das müßte eigentlich schon reichen

edit3:
tada 🙂 http://www.manoli.net/csharpformat/format.aspx

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

&lt; &gt; wars... sollte ich eigentlich wissen, hab zuweit gesucht X(
Natürlich noch "\n" -> "<br />"

Jetzt ist nur noch das Problem mit den Umlauten vorhanden.
Also ä wird gar nicht angezeigt.

Habe den Encoding Tester (vom Forum) schon getestet, ist mit keinem Zeichensatz richtig angezeigt worden.

Hat vielleicht noch jemand einen Tipp?

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Peter Bucher,

dann poste mal die HexCodes der Umlaute (äöüÄÖÜß). Sonst werden wird nicht viel sagen können.

herbivore

S
1.047 Beiträge seit 2005
vor 18 Jahren

die deutschen umlaute sind im latin 1 (ISO-8859-1) zeichensatz enthalten... d.h. wenn du sie nicht codeirt (siehe nächste abschnitt) reinschreiben willst, mußt du den encoding typ vom html dokument mit angeben...

besser wäre es allerdings wenn du ä,ö,ü,ß usw. durch &auml; &ouml; &uuml; &szlig; bzw. deren html-unicodes ersetzt

näheres dazu
http://www.selfhtml.net/html/referenz/zeichen.htm
http://www.selfhtml.net/html/kopfdaten/meta.htm#zeichensatz

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Irgendwas ist immer noch nicht gut.
Wenn ich den content (den ich dann in die Datei schreibe) z. B. mit content.Replace("ä", "&auml;"); replace, kommt bei einem ä ein u raus.

Scheint also doch irgendwie an der Codierung liegen?!

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Peter Bucher,

und wenn es an der Codierung liegt brauchen wir die Codes, um dir zu helfen.

herbivore

S
1.047 Beiträge seit 2005
vor 18 Jahren

wenn du dir html dateien erzeugen läßt, dan nschau dir mal den quelltext der html datei an, wie dort die zeichen drin stehen.

wenn dort anstelle eines ä &auml; steht, dann hast du zumindest die zeichen richtig ersetzt

ansonten wird jetz langsam zeit für codeschnipsel und htmlschnipsel 😁

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Okaaay 👍

Es steht ein u drinn.... ich denke wirklich es liegt an der Codierung...


using System;
using System.IO;

namespace SyntaxWriter
{
	/// <summary>
	/// Zusammenfassung für Class1.
	/// </summary>
	class Class1
	{
		static string app_directory = Environment.CurrentDirectory = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;
		static string content;
		/// <summary>
		/// Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			if(args.Length != 0) {
				Console.Write("args fired!");
				Console.WriteLine(args[0]);
				WriteTextFile(ReadTextFile(args[0]));
			}
			Console.ReadLine();
		}

		static void WriteTextFile(string content) {
			StreamWriter sw = File.CreateText(app_directory + "\\output.html");
			content = content.Replace("<", "&lt;");
			content = content.Replace(">", "&gt;");
			content = content.Replace("\n", "<br />");
			content = content.Replace("ä", "&auml;");
			sw.Write("<p>" + content + "</p>"); // Testeshalber
			sw.Close();
		}

		static string ReadTextFile(string s_path) {
            string output;			
			StreamReader sr = new StreamReader(s_path);
			output = sr.ReadToEnd();
			return output;
		}
	}
}

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
1.047 Beiträge seit 2005
vor 18 Jahren

hab hier und da was geändert, jetzt gehts zumindest bei mir 🙂

using System;
using System.Text;
using System.IO;

namespace SyntaxWriter
{
    /// <summary>
    /// Zusammenfassung für Class1.
    /// </summary>
    class Class1
    {
        static string app_directory = Environment.CurrentDirectory = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            if(args.Length != 0) {
                Console.Write("args fired!");
                Console.WriteLine(args[0]);
                WriteTextFile(ReadTextFile(args[0]));
            }
            Console.ReadLine();
        }

        static void WriteTextFile(string content) {
            content = content.Replace("&", "&amp;");
            content = content.Replace("    ", "&nbsp;&nbsp;&nbsp;&nbsp;");            
            content = content.Replace("<", "&lt;");
            content = content.Replace(">", "&gt;");            
            content = content.Replace(Environment.NewLine, "<br />"+Environment.NewLine);
            content = content.Replace("ä", "&auml;");
            content = content.Replace("ö", "&ouml;");
            content = content.Replace("ü", "&uuml;");
            content = "<p>" + content + "</p>";
            File.WriteAllText(Path.Combine(app_directory,"output.html"),content,Encoding.Default);
        }

        static string ReadTextFile(string s_path) {
            return File.ReadAllText(s_path,Encoding.Default);
        }
    }
}

letzen endes hab ich sowohl beim einlesen und schreiben der dateien das encoding explizit auf default gesetzt, was dann die von windows nimmt.
dazu hab ich noch deine ersetzungen etwas abgeändert

zudem war dein pfad für die ausgabe mit "\output.html" inkorrekt, das muß "\output.html" heißen bzw. @ vorm string benutzen
besser ist das path.combine, da platformunabhängig

zu guter letzt hab ich noch dein lesen und schreiben durch die statischen methoden von file ersetz. wenn du deine beibehältst, mußt du mal das encoding setzen

da die codetags etwas verbugt sind, hab ich die ersetzung der zeilenumbrüche mit Environment.Newline gemacht

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Ich bekomme mit deiner Version folgenden Fehler:

'System.IO.File' enthält keine Definition für 'WriteAllText'

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
1.047 Beiträge seit 2005
vor 18 Jahren

achso, war mit c# 2.0 geschrieben ...

sonst ersetz das einfach weider durch deinen code, aber stell das encoding mit ein

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Die Funktionen des V 2.0 FW gefallen mir aber 😁 8)

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

S
709 Beiträge seit 2005
vor 18 Jahren

Original von Peter Bucher
Die Funktionen des V 2.0 FW gefallen mir aber 😄8)

Jo, es sind schon einige coole Dinge hinzugekommen. Liest du die Zeitschrift iX? Da steht in der aktuellen Ausgabe ein Bericht von Rudolf Huttary und Arne Schäpers über die Neuerungen im .NET Framework 2.0 drinnen.

Gruß.
SimonKnight6600

Peter Bucher Themenstarter:in
5.941 Beiträge seit 2005
vor 18 Jahren

Nein, wurde aber Heute schon einmal dazu hingewiesen 😉 🙂

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen,

die beiden schreiben regelmäßig in der c't zu .NET:

http://www.heise.de/ct/inhverz/search.shtml?T=Huttary+Sch%E4pers&Suchen=suchen

herbivore