Salman350 Ответов: 2

Как сделать массовое удаление файла, имеющего запятую в имени файла с логикой разделения


Мы сохраняем и удаляем несколько файлов в физическом пути с логикой, разделенной запятыми (,). Таким образом, я не получаю никаких проблем при сохранении, но файлы не удаляются из физического пути из-за логики разделения.

public ContentResult RemoveFiles(RequestModel reqModel)
    {
        var physicalPath = GetPhysicalPath(reqModel);
        var removeGroupPageId = reqModel.Get(ParamTypes.RouteData, "itemId");
        if (removeGroupPageId != "")
        {
            physicalPath = String.Concat(reqModel.Get(ParamTypes.Config, "RootDirectoryPhysical"), SessionWrapper.HomeDirectory, @"\Group", removeGroupPageId);
        }
        var files = reqModel.Get(ParamTypes.Form, "files", "").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

        foreach (var path in files.Select(file => String.Concat(physicalPath, @"\", file)).Where(System.IO.File.Exists))
        {
            System.IO.File.Delete(path);
        }
        return Content("{ \"success\": true }", "application/json");
    }


Итак, кто-нибудь знает, как я могу устранить эту проблему?

Что я уже пробовал:

Я еще ничего не пробовал, но ищу решение для расщепления.

2 Ответов

Рейтинг:
9

#realJSOP

public static List<string> GetFileNames(string path, string data)
{

    List<string> filenames = new List<string>();
    if (!string.IsNullOrEmpty(data))
    {
        List<string> parts = data.Split(',').ToList();
        string filename = string.Empty;
        do
        {
            filename = string.Format("{0}{1}{2}", filename, (filename.Length > 0)?",":"", parts[0]);
            if (File.Exists(System.IO.Path.Combine(path, filename)))
            {
                filenames.Add(filename);
                filename = string.Empty;
            }
            parts.RemoveAt(0);
        } while(parts.Count > 0);
    }
    return filenames;
}


Пример использования:

var files = "blah blah,a.xyz,blahblah.xyz";
List<string> filenames = GetFileNames(@"C:\mypath", files);
// now, do something with the resulting valid filenames (you know they're valid 
// because they wouldn't be in the list if they weren't.


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

Альтернатива для вас - измените символ разделителя на что-то, что не является допустимым символом имени файла, например звездочку, символ трубы, знак вопроса и т. д. В этот момент вы можете просто использовать string.Split метод.


Рейтинг:
13

OriginalGriff

Просто: не разделяйте элементы с любым символом, который является законным в пути к файлу. Если вы это сделаете, вы напрашиваетесь на проблемы, которые будет очень трудно решить.

Поэтому вместо того, чтобы разделять пути запятыми, используйте символ вертикальной полосы'|', поскольку это вообще запрещено в путях: Именование файлов, путей и пространств имен (Windows)[^]