14. oktober 2010 - 00:00Der er
36 kommentarer og 1 løsning
Læse oplysninger fra en fil og skrive over i en anden
Hej eksperter.
Jeg vil høre, om det er muligt at lave et lille program, der kan læse nogle oplysninger fra en fil og skrive det over i en tekstfil.
Det skal kunne læse filnavnet, filstørrelsen og nogle andre ting - vi kan jo lige starte med disse, så kan jeg selv se, om jeg kan arbejde videre derfra. Det er et krav, at disse værdier som læses, skal skrives ind bestemte steder i en given fil (fx en bestemt linje osv).
Som Lasse skriver, så kan du bruge System.IO.FileInfo klassen til at få ud Information om en fil.
Det kan være lidt besværligt at hoppe rundt i en fil, og bare skrive bestemte steder i filen. Hvis filen ikke er alt for stor, er det nemmere at læse hele indholdet af filen til en streng, sætte værdier ind i strengen, og til slut overskrive filen med den nye tekst.
Du læser alt indhold af en fil til en string på følgende måde: string fileContent = File.ReadAllText(fileName);
Nu kan du manipulere alt det du vil med fileContent variablen. Når du er klar, skriver du tilbage til filen på denne måde: File.WriteAllText(fileName, fileContent);
Jeg tilslutter mig aaberg_cc, men vil tilføje at du eventuelt kan kigge nærmere på StringBuilder, og bruge den til at cache indholdet af den nye fil, den er nem at arbejde med hvis du skal indsætte linier og detaljer på bestemte positioner, når du har klargjort indholdet af den nye fil, så kan du skrive filen med
File.WriteAllText(stringbuilder.ToString());
Men vær lige opmærksom på at dette er tekst filer, men hvis det drejer sig om meget store mængder data eller binær data, så skal du skrive løbende til en fil for at få bedste rigtige resultat.
Først skal det lige siges, at jeg ikke leder efter en færdig løsning, beklager hvis mit første indlæg bar præg af det. Jeg var simpelthen på bar bund, men er nu kommet lidt videre, takket være jeres indlæg. Dette er hvad jeg har indtil videre: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
namespace test { class Program { static void Main(string[] args) { Double Str; System.IO.FileInfo fil = new System.IO.FileInfo("c:\\Documents and Settings\\User\\Skrivebord\\test.avi"); //Console.WriteLine(fil.Length.ToString()); Double size = unchecked((int)fil.Length); Str = (size / 1024) / 1024; Console.WriteLine("Filen fylder {0:n0} MiB", Str); string fileContent = File.ReadAllText("c:\\Documents and Settings\\User\\Skrivebord\\test.txt");
Så langt, så godt... Nu aner jeg bare ikke, hvordan jeg får nuppet den værdi og skrevet over på en bestemt linje i min test.txt - er der nogen der vil hjælpe? På forhånd tak.
Btw. overstående er nemt på en hjælpsom måde, for at vi kan hjælpe bør du komme med så mange informationer som du mener vi vil kunne få noget ud af, for at kunne svare på dit spørgsmål.
Hold da op, nu spiller det jo bare... Mange tak allesammen for jeres hjælp og tålmodighed! Jeg har dog en sidste bøn - En metode hvorpå jeg kan få indlæst bitrate på videoen og lyden, for derefter at få det skrevet over i min .txt-fil.
Hehe... Igen, undskyld den mangelfulde info, men har simpelthen kørt så meget rundt i det, at jeg hverken kan finde hoved eller hale i det længere...
Men fx da jeg "bare" tog dette over:
namespace test { class MovieFileDetails { public Shell32.Shell Sh = new Shell32.Shell(); public Shell32.Folder F; public Shell32.FolderItem FI;
static void Main(string[] args) {
string VideoBitrate, AudioBitrate, MovieFile = ("c:\\Documents and Settings\\User\\Skrivebord\\test.avi"); if (System.IO.File.Exists(MovieFile))
så kom der allerede en masse fejl: An object reference is required for the non-static field, method, or property 'test.MovieFileDetails.F' C:\Documents and Settings\User\dokumenter\visual studio 2010\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs
Ja, I må meget undskylde min uvidenhed. Jeg synes jeg har prøvet...
Første del af det ... og tilføjet en reference som han skriver i starten: I searched alot for a way to get details of a video file, without the need of a third party component. Im developing a video library on my free time, and I wanted the user to get this data automatically after selecting the video. The class uses shell32.dll which is what Windows Explorer uses to get the video details, and is available in every Windows installation. I tested my app on Windows XP and Vista. So to use this dll just open the Add Reference dialog box, select the COM tab, select Microsoft Shell Controls And Automation and click OK.
Igen ... vi kan ikke se hvad du ser, så du må forklare hvad du har gjort ...
Ja, jeg har prøvet at kopiere det hele ind, det gav en masse bøvl, da det jeg er igang med, "bare" er et consoleapp. Så prøvede jeg at kopiere det ind som Windows Forms app og selvfølgelig gøre som han har skrevet og tilføjet en reference, men det gav 21 fejl, bl.a.:
A namespace cannot directly contain members such as fields or methods c:\documents and settings\User\dokumenter\visual studio 2010\Projects\WindowsFormsApplication3\WindowsFormsApplication3\Program.cs
Derefter prøvede jeg så at udskille de ting i hans kode, jeg mente jeg skulle bruge til at få lavet de to sidste linjer, med det resultat ovenfor her.
Så har jeg den fra den side, jeg linkede til, som jeg ikke helt ved, om jeg kan bruge til noget, hvilken slags 'New Project' jeg skal paste den ind i. Eller hvilke dele jeg skal tage derfra: http://www.nomorepasting.com/getpaste.php?pasteid=34706
Ye, den havde jeg også luret, nu er jeg nede på, at der 'kun' er fejl i følgende linje:
MSG += "Please make sure the right codecs are installed";
Fejlen er:
The left-hand side of an assignment must be a variable, property or indexer C:\Documents and Settings\User\dokumenter\visual studio 2010\Projects\WindowsFormsApplication3\WindowsFormsApplication3\Program.cs
Fjerner jeg alt i 'catch', får jeg følgende fejl: Program 'C:\Documents and Settings\User\dokumenter\visual studio 2010\Projects\WindowsFormsApplication3\WindowsFormsApplication3\obj\x86\Debug\WindowsFormsApplication3.exe' does not contain a static 'Main' method suitable for an entry point
Der sker dog ikke noget, når jeg prøver at afvikle programmet, men det er sådan set mindre vigtigt. Jeg kan ikke lige lure, hvor jeg kan indtaste hvilken mappe den skal kigge efter en .avi i. Ydermere er jeg i tvivl om hvor meget jeg skal hive med over i mit consoleapp.
///<summary> /// This class gets the movie file's details using the windows shell /// </summary> public class MovieFileDetails { private Shell32.Shell Sh = new Shell32.Shell(); private Shell32.Folder F; private Shell32.FolderItem FI;
///<summary> /// The runtime (play time) of the movie /// </summary>
public readonly string Runtime;
///<summary> /// The screen resolution of movie (Format: Width X Height) /// </summary>
public readonly string Resolution;
///<summary> /// The file size in MB of the movie /// </summary>
public readonly string FileSize;
///<summary> /// The audio bitrate of the movie (Example: 127kbps) /// </summary>
public readonly string Audio;
///<summary> /// Frame rates per second and total bitrate /// </summary>
public readonly string Video;
public MovieFileDetails(string MovieFile) { //Got this using Windows Vista, didnt try it in XP or earlier releases //1 file size = 702 MB //27 length = 01:33:45 //28 Audio Bitrate= 127kbps //262 data rate= 3kbps //263 frame height = 416 //265 frame rate = 23 frames/second //265 frame width = 560 //266 total bitrate = 130kbps
if (System.IO.File.Exists(MovieFile)) { try { F = Sh.NameSpace(System.IO.Path.GetDirectoryName(MovieFile)); FI = F.ParseName(System.IO.Path.GetFileName(MovieFile));
//set the fields Runtime = F.GetDetailsOf(FI, 27); Resolution = F.GetDetailsOf(FI, 265) + " X " + F.GetDetailsOf(FI, 263);
//remove formatting, i.e. '701' instead of '701 MB' FileSize = F.GetDetailsOf(FI, 1).Substring(0, 4).Trim();
Audio = F.GetDetailsOf(FI, 28); Video = F.GetDetailsOf(FI, 265) + ", Total BitRate: " + F.GetDetailsOf(FI, 266); } catch (Exception ex) { const string MSG = "Could not get movie file information. "; Console.WriteLine("{0} - {1}", MSG, "Please make sure the right codecs are installed"); } } else { Console.WriteLine("The file does not exists"); } } } }
Er helt enig med dig, i at der er meget jeg ikke ved. Derfor havde jeg selv planer om at høre jer mere erfarne, hvordan I er kommet så langt som I er. Det eneste jeg har, er 3 uger på teknisk skole med en lærer, der ikke kunne lære fra sig. Men jeg vil starte på biblioteket i morgen, er der nogle bøger du kan anbefale?
Jeg siger endnu engang mange tak for hjælpen og tålmodigheden og går straks igang med at prøve at få smidt den kode ind i min egen.
Han vil sikkert aldrig mere have hjælp her på eksperten ... det kunne være en grund.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.