Как создать папку из первых нескольких букв имени файла? - PullRequest
0 голосов
/ 31 августа 2018

Итак, я проверил основные вещи, но я хотел бы сделать следующее:

У меня есть 5 файлов, скажем: X1_word_date.pdf, XX1_word_date.pdf и т. Д. ...

Я хотел бы создать структуру папок, например: C: \ PATH \ X1, C: \ PATH \ XX1 и т. Д ...

Так как мне взять первые буквы перед '_' в именах файлов и поместить их в строку?

Моя идея заключается в том, что я использую Directory.CreateDirectory, а затем объединяю основной путь и строки, чтобы получить папки.

Как мне это сделать? Помощь оценена.

Ответы [ 5 ]

0 голосов
/ 31 августа 2018

Использование увеличенного изображения, начиная только с вашего каталога Source и Destination.
Мы можем перечислить все файлы, которые нам нужно переместить, с помощью Directory.GetFiles .
В этом списке мы сначала изолируем имя файла с помощью GetFileName .
Используя простой String.Split , вы получите новое имя каталога.
Directory.CreateDirectory создаст каталоги, если они уже не существуют.
Чтобы переместить файл, нам нужен путь к нему, сочетание пути к каталогу и имя файла.

string sourceDirectory = @"";
string destDirectory = @"";

string[] filesToMove = Directory.GetFiles(sourceDirectory); 

foreach (var filePath in filesToMove) {
    var fileName = Path.GetFileName(filePath);
    var dirPath = Path.Combine(destDirectory, fileName.Split('_')[0]);
    var fileNewPath= Path.Combine(dirPath,fileName);
    Directory.CreateDirectory(dirPath);// If it exist it does nothing.
    File.Move(filePath, fileNewPath);
}
0 голосов
/ 31 августа 2018

С помощью простых строковых методов, таких как Split и класс System.IO.Path:

var filesAndFolders = files
.Select(fn => new
{
    File = fn,
    Dir = Path.Combine(@"C:\PATH", Path.GetFileNameWithoutExtension(fn).Split('_')[0].Trim())
});

Если вы хотите создать эту папку и добавить файл:

foreach (var x in filesAndFolders)
{
    Directory.CreateDirectory(x.Dir); // will only create it if it doesn't exist yet
    string newFileName = Path.Combine(x.Dir, x.File);
    // we don't know the old path of the file so i can't show how to move
}
0 голосов
/ 31 августа 2018

Предполагается, что ваш files является List<string>, который содержит имя файла (X2_word_date.pdf, ...)

files.ForEach(f => {
    var pathName=  f.Split('_').FirstOrDefault();
    if(!string.IsNullOrEmpty(pathName))
    {
        var directoryInfo = DirectoryInfo(Path.Combine(@"C:\PATH", pathName));
        if(!directoryInfo.Exists)
            directoryInfo.Create();

       //Then move this current file to the directory created, by FileInfo and Move method 
    }
})
0 голосов
/ 31 августа 2018

Или используя регулярное выражение

            string mainPath = @"C:\PATH";
            string[] filenames = new string[] { "X1_word_date.pdf", "X2_word_date.pdf" };
            foreach (string filename in filenames)
            {
                Match foldernameMatch = Regex.Match(filename, "^[^_]+");
                if (foldernameMatch.Success)
                    Directory.CreateDirectory(Path.Combine(mainPath, foldernameMatch.Value));
            }
0 голосов
/ 31 августа 2018
string fileName = "X1_word_date.pdf";
string[] tokens = fileName.Split('_');
string myPath = "C:\\PATH\\";
Directory.CreateDirectory( myPath + tokens[0]); 

Нечто подобное должно работать. Использование Split() также позволит обрабатывать числа больше 9

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