Gjest Skrevet 7. juni 2011 Skrevet 7. juni 2011 (endret) Heisann! Skal prøve å forklare så godt jeg kan. GetFiles() har følgende kode: Directory.GetFiles(path As String, searchPattern As String) Her er det mulighet for searchPattern hvor du f.eks kan oppgi: *.log hvor den da bare finner *.log filer i mappen. Det jeg ønsker er at jeg kunne angi en mål-mappe og legge inn en Array som inneholder extensions den ikke skal ta med. Med extensions tenker jeg på filendelsen for en fil, f.eks: *.dat eller *.exe. Her orginal-koden i C# som ligger i en klasse jeg jobber opp i mot: // Fullpath er en property // IgnoreHidden er en property // TorrentName er en property private void LoadFiles() { char sep = System.IO.Path.DirectorySeparatorChar; string fullPath = System.IO.Path.GetFullPath (Path); if (File.Exists (fullPath)) { TorrentName = System.IO.Path.GetFileName(fullPath); Files = new List<FileMapping> { new FileMapping(fullPath, TorrentName) }; return; } if (!fullPath.EndsWith(sep.ToString())) fullPath += sep.ToString(); // Process all directories and subdirectories of this folder // and add all the files to the 'files' list. List<string> files = new List<string> (); Queue<string> directories = new Queue<string> (); directories.Enqueue(fullPath); while (directories.Count > 0) { string current = directories.Dequeue (); if (IgnoreHidden) { DirectoryInfo info = new DirectoryInfo (current); if ((info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) continue; } foreach (string s in Directory.GetDirectories (current)) directories.Enqueue (s); files.AddRange (Directory.GetFiles (current)); } // If we're ignoring hidden files, remove all the files with the hidden attribute if (IgnoreHidden) { files.RemoveAll (delegate (string file) { return (new FileInfo (file).Attributes & FileAttributes.Hidden) == FileAttributes.Hidden; }); } // Turn the full path of each file into a full path + relative path. The relative path is the 'path' // which the file will have within the .torrent metadata. Files = files.ConvertAll<FileMapping> (delegate (string file) { return new FileMapping(file, file.Substring(fullPath.Length)); }); // Set the torrent name (user can change it later) TorrentName = new DirectoryInfo(fullPath).Name; } Har prøvd meg litt, men er ikke så lett når jeg ikke kan så mye C# selv. Kan jeg f.eks lage en ny property i denne klassen som er et array og f.eks i min kode gjøre slik: instanceOfThisClass.FilterExtension = MyArray? Og videre i denne koden gjøre noe liggende som det er gjort med IgnoreHidden-ifen? Problemet er jeg ikke har klart det enda. Har prøvde med på følgende: if (Filter.Length > 0) { files.RemoveAll((string file) => (Filter.Contains(new FileInfo(file).Extension))); } Håper du forstår hva jeg mener, hvis ikke så er det bare å spørre! Endret 7. juni 2011 av Gjest
GeirGrusom Skrevet 8. juni 2011 Skrevet 8. juni 2011 (endret) Du kan bruke en blanding av regular expressions og LINQ public static IEnumerable<string> GetFiles(string path, params string[] extensions) { string exp = extensions.Aggregate((a, b) => a + @"|\." + b); exp = @"(\." + exp + ")$"; return from file in System.IO.Directory.GetFiles(path) where System.Text.RegularExpressions.Regex.IsMatch(file, exp) select file; } Brukes slik: var executable_files = GetFiles("C:\\Windows\\System32", "dll", "exe", "sys"); edit: når jeg tenker meg om er dette fullstendig unødvendig. For å ha flere filter skiller du dem med semikolon. *.exe;*.dll;*.sys edit2: jeg var litt borte, du skal jo ha det omvendte, altså alle filer hvor regex IKKE matcher: [code]public static IEnumerable<string> GetFiles(string path, params string[] extensions) { string exp = extensions.Aggregate((a, b) => a + @"|\." + b); exp = @"(\." + exp + ")$"; return from file in System.IO.Directory.GetFiles(path) where !System.Text.RegularExpressions.Regex.IsMatch(file, exp) select file; } Endret 8. juni 2011 av GeirGrusom
Gjest Skrevet 8. juni 2011 Skrevet 8. juni 2011 (endret) Hei GeirGrusom! Takk for et flott svar! Skal jeg da heller bruke din GetFiles() i stedet for det som i er Directory-klassen? i den C#-koden i min førstepost? Jeg regner med det og kommer tilbake med mer seinere idag! Endret 8. juni 2011 av Gjest
GeirGrusom Skrevet 8. juni 2011 Skrevet 8. juni 2011 Hei GeirGrusom! Takk for et flott svar! Skal jeg da heller bruke din GetFiles() i stedet for det som i er Directory-klassen? i den C#-koden i min førstepost? Jeg regner med det og kommer tilbake med mer seinere idag! Det var idéen
Gjest Skrevet 8. juni 2011 Skrevet 8. juni 2011 (endret) Heisann! Skulle det brukes slik: var executable_files = GetFiles("C:\\Windows\\System32", "dll", "exe", "sys"); eller: *.exe;*.dll;*.sys ? EDIT: Ser ut som bare den første fungerer, altså: var executable_files = GetFiles("C:\\Windows\\System32", "dll", "exe", "sys"); Hva om brukeren selv taster inn en verdi i textbox, f.eks følgende: *.dll;*.sys;*.log - Hvordan kan jeg da kjøre på med det? EDIT: Prøvde meg litt og løste det: GetFiles(current, Filter.Split(new char[]{ ';' })) Endret 8. juni 2011 av Gjest
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå