Gå til innhold

[Løst] [VB.NET / C#] Motsatte av Directory.GetFiles med search-pattern


Anbefalte innlegg

Skrevet (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 av Gjest
Videoannonse
Annonse
Skrevet (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 av GeirGrusom
Skrevet (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 av Gjest
Skrevet

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 :)

Skrevet (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 av Gjest

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...