Файлы каталогов c #, обрабатывают каждую верхнюю папку отдельно с соответствующими подпапками и файлами - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь получить каждую папку, подпапки и файлы в объект из пути.

В этом пути будет много папок верхнего уровня со многими подпапками и файлами.

Мне нужно обрабатывать каждую верхнюю папку, ее подпапки и файлы отдельно.

example 

C: \ Temp \ Folder1 \ подпапка \ подтекстов
C: \ temp \ Folder2 \ SubFiles \ SubFolders \ SubFiles

Необходимо обработать Folder1 с его подкаталогами и заключить его в объект. и то же самое для папки 2.

Вот некоторый код, доступ к которому запрещен, потому что поток остается открытым, и если я заверну поток в использование, он будет закрыт, прежде чем я смогу обработать информацию.

   private static IEnumerable<LocalFile> GetLocalFile(string source)
    {
        return Directory.GetDirectories(source)
            .SelectMany(m =>
            {
                return Directory.EnumerateFileSystemEntries(m, "*", SearchOption.AllDirectories)
                .Select(x =>
                {
                    var relative = x.Substring(source.Length + 1);
                    var localFile = new LocalFile(relative,
                        () =>
                    {
                        return File.OpenRead(x);
                    });
                    return localFile;
                });
            });
    }


    public sealed class LocalFile
{
    private readonly Func<Task<Stream>> openLocal;

    public LocalFile(string relativePath, Func<Stream> openLocal)
    {
        if (openLocal == null)
        {
            throw new ArgumentNullException(nameof(openLocal));
        }

        this.RelativePath = relativePath ?? throw new ArgumentNullException(nameof(relativePath));
        this.openLocal = () => Task.FromResult(openLocal());
    }

    public LocalFile(string relativePath, Func<Task<Stream>> openLocal)
    {
        this.RelativePath = relativePath ?? throw new ArgumentNullException(nameof(relativePath));
        this.openLocal = openLocal ?? throw new ArgumentNullException(nameof(openLocal));
    }

    public string RelativePath { get; }




    public Task<Stream> OpenLocal() => this.openLocal();
}

Спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

Наконец-то понял ...

сделал новый класс

public class LocalFolder
{
    public string FolderPath { get; }
    public IEnumerable<LocalFile> FolderFiles { get; }



    public LocalFolder(string folderPath, IEnumerable<LocalFile> files)
    {
        this.FolderPath = folderPath ?? throw new ArgumentNullException(nameof(folderPath));
        this.FolderFiles = files ?? throw new ArgumentNullException(nameof(files));
    }
}

вот код

 private static IEnumerable<LocalFolder> GetFolderFiles(string source)
    {
        var directories = Directory.EnumerateFileSystemEntries(source);

        var folderFiles = directories
            .Where(d => !d.Contains("."))
             .Select(m =>
             {
                 var files = Directory.EnumerateFiles(m, "*", SearchOption.AllDirectories)
           .Select(f =>
           {
               var relative = f.Substring(source.Length + 1);

               return new LocalFile(relative, () => File.OpenRead(f));
           });
                 return new LocalFolder(m,
                     files);
             });

        var filesinDir = directories
           .Where(d => d.Contains("."))
            .Select(m =>
            {
                var files = Directory.EnumerateFiles(source, "*", SearchOption.TopDirectoryOnly)
          .Select(f =>
          {
              var relative = f.Substring(source.Length + 1);

              return new LocalFile(relative, () => File.OpenRead(f));
          });
                return new LocalFolder(m,
                    files);
            });

        return folderFiles.Concat(filesinDir);
    }

Надеюсь, это поможет тому, кто сталкивается с подобной ситуацией.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...