Avatar billede Kaffekoppen Nybegynder
14. oktober 2010 - 00:00 Der 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).

På forhånd mange tak for hjælpen.
Avatar billede lasserasch Juniormester
14. oktober 2010 - 00:32 #1
Som mange andre herinde også ville sige, så er Eksperten.dk 'Hjælp til selvhjælp'.

Læs også FAQ
http://www.eksperten.dk/faq#faq-8-2
http://www.eksperten.dk/faq#faq-8-3

Så du får næppe en komplet løsning leveret uden at du prøver selv.

Mvh.
Lasse
Avatar billede lasserasch Juniormester
14. oktober 2010 - 00:34 #2
Men som udgangspunkt vil jeg dog sige at du skal kigge på 'System.IO.FileInfo'.

Mvh.
Lasse
Avatar billede aaberg Nybegynder
14. oktober 2010 - 12:40 #3
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);
Avatar billede bkp Nybegynder
16. oktober 2010 - 19:11 #4
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.
Avatar billede Kaffekoppen Nybegynder
19. oktober 2010 - 16:02 #5
Hej igen.

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.
Avatar billede arne_v Ekspert
19. oktober 2010 - 16:21 #6
Man kan ikke generelt opdatere midt i en tekstfil.

Du læser den gamle fil og skriver en ny fil.
Avatar billede arne_v Ekspert
19. oktober 2010 - 16:22 #7
Double Str;
            Double size = unchecked((int)fil.Length);
            Str = (size / 1024) / 1024;

ville jeg lave som:

long fstr = fil.Length / (1024*1024);
Avatar billede Kaffekoppen Nybegynder
19. oktober 2010 - 16:31 #8
Tak for info, arne_v, men hvordan skriver jeg så til en ny fil, med størrelsen osv på en given linje?
Avatar billede aaberg Nybegynder
19. oktober 2010 - 20:13 #9
Her er et eksempel på, hvordan du kan skrive noget til linje 3 i en fil:

//læs fra fil.
string fileContent = File.ReadAllText(fileName);

//Find linje 3
int strIdx = 0;
for (int lineNr = 1; lineNr <3; lineNr++)
{
    strIdx = fileContent.IndexOf("\n", strIdx) + 1;
}

//tilføj noget tekst på linje 3.
fileContent = fileContent.Insert(strIdx, "Dette tekst settes ind på linje 3\n");

//skriv tilbage til fil.
File.WriteAllText(fileName, fileContent);
Avatar billede Kaffekoppen Nybegynder
19. oktober 2010 - 23:05 #10
Mange tak aaberg_cc, problemet er bare, at jeg ikke kan tilføje den værdi, som jeg har fra tidligere.

fileContent = fileContent.Insert(strIdx, "{0} fylder {1} MB\n",filnavn, str);
Avatar billede Syska Mester
19. oktober 2010 - 23:27 #11
Hvad betyder "kan" i dette tilfælde?

Kan det ikke compile eller er det fordi det ikke virker?

Hvad gør den? Hvad indeholder filen? Hvad burde den indeholde? Hvad er din komplette kode som du prøver at få til at gøre et eller andet ...

Det er svært at hjælpe uden at få en masse information :-)

mvh
Avatar billede Syska Mester
19. oktober 2010 - 23:28 #12
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.

mvh
Avatar billede Kaffekoppen Nybegynder
19. oktober 2010 - 23:40 #13
Yes, den er jeg med på :)


Her er min kode:
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");
            Double size = unchecked((int)fil.Length);
            Str = (size / 1024) / 1024;
                       
            //læs fra fil.
            string fileContent = File.ReadAllText("c:\\Documents and Settings\\User\\Skrivebord\\test.txt");
                       
            //Find linje 3
            int strIdx = 0;
            for (int lineNr = 1; lineNr < 3; lineNr++)
            {
                strIdx = fileContent.IndexOf("\n", strIdx) + 1;
            }
            //tilføj noget tekst på linje 3.
            fileContent = fileContent.Insert(strIdx, "Filen fylder {1} MB\n", Str); <---Her går det galt

            //skriv tilbage til fil.
            File.WriteAllText("c:\\Documents and Settings\\User\\Skrivebord\\test.txt", fileContent);

"No overload for method 'Insert' takes 3 arguments"
Avatar billede Kaffekoppen Nybegynder
19. oktober 2010 - 23:42 #14
Og der står selvfølgelig:
fileContent = fileContent.Insert(strIdx, "Filen fylder {0} MB\n", Str);
Avatar billede Syska Mester
20. oktober 2010 - 00:32 #15
fileContent = fileContent.Insert(strIdx, string.Format("Filen fylder {0} MB\n", Str));
Avatar billede Kaffekoppen Nybegynder
20. oktober 2010 - 20:43 #16
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.

Jeg har fundet noget på en anden side: http://codehill.com/2008/12/get-a-video-files-details-using-windows/ som også skulle være noget C#, men jeg har forgæves prøvet at tilføje noget af det, desværre uden held.
Avatar billede Syska Mester
20. oktober 2010 - 22:28 #17
Igen ... hvad betyder uden held .. er det compile fejl ? Exceptions ?

We need info ...
Avatar billede Kaffekoppen Nybegynder
20. oktober 2010 - 22:47 #18
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...
Avatar billede Syska Mester
20. oktober 2010 - 22:55 #19
Har du kopieret hele hans eksempel ind ?

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 ...
Avatar billede Kaffekoppen Nybegynder
20. oktober 2010 - 23:03 #20
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.
Avatar billede Syska Mester
20. oktober 2010 - 23:15 #21
Smid din kode herind ... du må gøre nogen ting forkert.

http://nomorepasting.com/
Avatar billede Kaffekoppen Nybegynder
20. oktober 2010 - 23:30 #22
Nu spørger jeg nok dumt, men hvilken kode vil du have? Jeg har en der virker, hvor jeg mangler at den finder og skriver A/V bitrate:
http://www.nomorepasting.com/getpaste.php?pasteid=34707


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
Avatar billede Syska Mester
20. oktober 2010 - 23:43 #23
Du kan i hvert fald starte med at rette de copy/paste problemer ...


<summary> er til kommentarer etc. og de står som kode i det du har postet ...


Og jeg kan så se at det er ham som har lavet det eksemple der har problemer da fejler kommer derfra ...

flyt alle:
<summary>

Til linjen over ... så det kommer til at ligne:

/// <summary> 

mvh
Avatar billede Kaffekoppen Nybegynder
20. oktober 2010 - 23:49 #24
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
Avatar billede Kaffekoppen Nybegynder
21. oktober 2010 - 00:12 #25
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
Avatar billede Syska Mester
21. oktober 2010 - 00:21 #26
Du har ikke en:

static void Main(){}

I dit program, så det ved ikke hvor det skal starte henne.

mvh
Avatar billede Kaffekoppen Nybegynder
21. oktober 2010 - 00:30 #27
Jeg satte den i starten og fik denne:

Expected class, delegate, enum, interface, or struct
Avatar billede aaberg Nybegynder
21. oktober 2010 - 09:19 #28
Din Main metode skal være inde i en klasse. .NET er 100% objekt-orienteret.
Avatar billede Kaffekoppen Nybegynder
21. oktober 2010 - 20:18 #29
Super, så langt, så godt. Mange tak for jeres tålmodighed...
Jeg har nu følgende:
http://www.nomorepasting.com/getpaste.php?pasteid=34711

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.
Avatar billede Syska Mester
21. oktober 2010 - 21:56 #30
Du bør nok starte med en C# bog når du får det her til at virke, der er nogen helt simple ting som du ikke ved.

Men fikser lige et eksemple som skal pastes ind i en ConsoleApp.
Avatar billede Syska Mester
21. oktober 2010 - 21:56 #31
using System;

namespace VideoInfoProject
{
    class Program
    {
        static void Main(string[] args)
        {
            var v = new MovieFileDetails(@"S:\Videos\ikea.wmv");

            Console.WriteLine("Audio: {0}", v.Audio);
            Console.WriteLine("RunTime: {0}", v.Runtime);
            Console.WriteLine("Resolution: {0}", v.Resolution);
            Console.WriteLine("FileSize: {0}", v.FileSize);
            Console.WriteLine("Video: {0}", v.Video);
        }
    }

    ///<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");
            }
        }
    }
}
Avatar billede Syska Mester
21. oktober 2010 - 21:57 #32
En lille ting ... hans eksemple er lidt mærkelig efter min mening. Der bør ikke være så meget logik i en constructor.

mvh
Avatar billede Kaffekoppen Nybegynder
21. oktober 2010 - 22:14 #33
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.
Avatar billede Syska Mester
21. oktober 2010 - 22:19 #34
De fleste fra WROX synes jeg er rimelig gode. Men alle bøger som starte med "beginning visual C#" bør være et godt bud.

Der er nu også meget starter hjælp rundt om på nettet ... bing it, så finder du helt sikkert noget som kan bruges.

mvh
Avatar billede Kaffekoppen Nybegynder
24. oktober 2011 - 20:41 #35
Problem solved.
Avatar billede arne_v Ekspert
24. oktober 2011 - 22:11 #36
Og hvorfor tog du lige selv point her????
Avatar billede Syska Mester
24. oktober 2011 - 22:53 #37
Han vil sikkert aldrig mere have hjælp her på eksperten ... det kunne være en grund.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester