Avatar billede Fooz Nybegynder
06. marts 2012 - 16:01 Der er 5 kommentarer og
1 løsning

Recursiv sletning af filer (ikke mapper)

Hej,

Jeg sidder med et problem. Jeg skal på en fornuftig måde håndtere, igennem en windows applikation, sletning af filer i en mappe og filer i undermapper og undermapper af undermapper osv osv.

dvs. jeg skal gerne kunne angive en sti (fx C:\temp\) og så få slettet filer men beholde strukturen (mapperne)

Som en lille detalje skal jeg også kunne angive en liste af strings (navne på filer / mapper (ikke paths)) som så skal skippes under sletningen. Det skal fungere således at hvis jeg angiver en mappe eller en fil, fx default.aspx, så skal alle filer ved navn default.aspx efterlades intakte, ligegyldigt deres placering i mappestrukturen.

Mappestrukturen skal gemmes af hensyn til individuelle rettigheder på mapperne i forbindelse med et web hosting miljø

Har nogen mon lavet noget tilsvarende tidligere? Evt. via en metode der kan kalde sig selv?
Avatar billede supertekst Ekspert
06. marts 2012 - 16:08 #1
Ja - det ligner på en måde - blot udarbejdet i VBA - se spm. 916623
Avatar billede Syska Mester
06. marts 2012 - 16:40 #2
private static void Delete(DirectoryInfo directoryInfo, params string[] skip)
{
    var fileInfos = directoryInfo.GetFiles("*.*", SearchOption.AllDirectories);

    foreach (var fileInfo in fileInfos)
    {
        if(skip.Contains(fileInfo.Name))
            continue;

        fileInfo.Delete();
    }
}

Noget ala det burde virke ... ikke tested.

Du burde så kunne kalde den sådan her:
var directoryInfo = new DirectoryInfo(@"C:\temp\");
Delete(directoryInfo, "default.aspx", "mysuperfile.txt");

mvh
Avatar billede Fooz Nybegynder
06. marts 2012 - 23:27 #3
Tak for svaret buzzzz,

Dit eksempel dækker dog ikke helt mine krav da du kun tager forbehold for at der skal skippes ved filnavne og ikke som jeg beskriver et mix af filnavne og mappenavne.

Det ser også ud til at hvis jeg har angivet en mappe, som jo kan være placeret alle steder, at der stadig vil blive slettet filer i mapperne under 'mappen', altså i mapper indeholdt af 'skip mappen'.

Jeg må rode noget mere og forhåbentlig komme op med noget som kan bruges
Avatar billede Syska Mester
06. marts 2012 - 23:34 #4
Så skal du ud i noget rekursivt.

Hvilket heller ikke burde være så svært.

private static void Delete(DirectoryInfo directoryInfo, params string[] skip)
{
    var fileInfos = directoryInfo.GetFiles("*.*", SearchOption.OnlyTop);

    foreach (var fileInfo in fileInfos)
    {
        if(skip.Contains(fileInfo.Name))
            continue;

        fileInfo.Delete();
    }

    foreach (var dir in directoryInfo.GetDirectories())
    {
        if(skip.Contains(dir.Name))
            continue;

Delete(dir, skip);
    }
}

Følgende er ikke test eller valid kode ... jeg kan have husket forkert på nogle properties eller methods.

Men det virker måske ... :-)
Avatar billede Fooz Nybegynder
07. marts 2012 - 09:47 #5
Tak buzzzz,

Her er hvad jeg endte op med

public void DeleteWebFiles(string startDir)
{
    string[] skipDirs = new string[Properties.Settings.Default.SkipDirs.Count];
    Properties.Settings.Default.SkipDirs.CopyTo(skipDirs, 0);

    DirectoryInfo dirInfo = new DirectoryInfo(startDir);
    FileInfo[] files = dirInfo.GetFiles("*.*", SearchOption.TopDirectoryOnly);

    foreach (FileInfo file in files)
    {
        if (!((IList<string>)skipDirs).Contains(file.Name))
        {
            file.IsReadOnly = false;
            File.Delete(file.FullName);
        }
    }
    foreach (DirectoryInfo dir in dirInfo.GetDirectories())
    {
        if (!((IList<string>)skipDirs).Contains(dir.Name))
        {
            DeleteWebFiles(dir.FullName);
        }
    }
}


Skriv et svar så deler jeg point ud :)
Avatar billede Syska Mester
07. marts 2012 - 09:54 #6
Altid noget du fik det løst.

Der ligger allerede et svar længere oppe, men der kommer lige et ekstra.

mvh
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

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