разделение строки с условиями - PullRequest
0 голосов
/ 15 октября 2018

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

имя файла: «Common - check - 01 [1080p] .mp4», "Directory_test File - 01.txt"

Я хочу, чтобы файл оставил первый "-", но удалите все, где он начинается с "- 01 [1080p] .mp4" или "- 01.txt".

 public bool creator(string mainFolder, string Folder)
    {
        try
        {
            //split to get the folder name, but only remove part of the text
            string[] split = Folder.Split('-');
            //making file path for folder
            string folderpath = Path.Combine(mainFolder, split[0]);
            string filePath = Path.Combine(mainFolder, Folder);
            // moving or/and creating folders and files
            if (!check(folderpath))
            {
                //creating creating folder
                Directory.CreateDirectory(folderpath);
                //moving file
                File.Move(filePath, folderpath);
                return true;
            }
            else
            {
                //moving file
                File.Move(filePath, folderpath);
                return true;
            }        
        }
        catch (IOException ex)
        {
            MessageBox.Show(ex.Message);
            throw;
        }
    }

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Похоже, что вы пытаетесь упорядочить файлы в каталоге, создавая папки для них на основе имени файла, и не можете найти последний экземпляр символа - для создания имени папки.

Один простой способ сделать это - использовать метод LastIndexOf, который будет возвращать индекс последнего экземпляра строки "-" или -1, если он не найден.

Я думаю, что есть и некоторые другие оптимизации, которые вы могли бы использовать здесь, где вы можете просто взять имя основной папки и затем просмотреть все файлы одновременно (это может быть не совсем то, что вы хотите, но это то, что я использовалв прошлом).Таким образом, вам нужно только указать путь mainFolder, а затем метод может сделать все остальное.Кроме того, вы можете безопасно вызывать CreateDirectory, даже если каталог уже существует (в этом случае он ничего не сделает).

Вот пример:

/// <summary>
/// Moves all files in mainFolder to a subfolder based on the file's name
/// </summary>
/// <param name="mainFolder">The root folder to scan for files</param>
/// <returns>true if the operation was successful</returns>
public static bool OrganizeFiles(string mainFolder)
{
    if (!Directory.Exists(mainFolder)) 
        throw new DirectoryNotFoundException(nameof(mainFolder));

    try
    {
        foreach (var file in Directory.EnumerateFiles(mainFolder))
        {
            var subFolderName = Path.GetFileNameWithoutExtension(file);
            var lastHyphen = subFolderName.LastIndexOf("-");

            if (lastHyphen > -1)
            {
                subFolderName = subFolderName.Substring(0, lastHyphen);
            }

            Directory.CreateDirectory(Path.Combine(mainFolder, subFolderName));

            File.Move(file, subFolderName);
        }

        return true;
    }
    catch (Exception e)
    {
        return false;
    }
}
0 голосов
/ 15 октября 2018

Существует два простых варианта:

string f = "Common - check - 01[1080p].mp4";
// If you need the individual parts...
string[] parts = f.Split('-');
string newName = string.Join("-", parts.Take(parts.Length - 1));
Console.WriteLine(newName);

// If you don't...
newName = f.Substring(0, f.LastIndexOf('-'));
Console.WriteLine(newName);

Хотя вы, вероятно, захотите вызвать .Trim() в результате любого из них, чтобы избежать пробела в конце.

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