带条件的字符串分割

时间:2018-10-15 19:39:01

标签: c# string split

我正在尝试通过使用文件来创建自动文件夹创建;里面的东西作为文件夹的名称。对于我来说,这是一个问题,其中某些文件名具有多个特殊字符,但是我只需要删除选定的字符串,例如:

文件名:“公用-检查-01 [1080p] .mp4”,“目录测试文件-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 :(得分:0)

有两个简单的选项:

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()以避免出现尾随空格。

答案 1 :(得分:0)

您似乎正在尝试通过基于文件名为它们创建文件夹来组织目录中的文件,而在查找-字符的最后一个实例以创建文件夹名时遇到了麻烦。 / p>

一种简单的方法是使用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;
    }
}