程序保存文件但不删除同名

时间:2016-07-26 16:06:00

标签: c# asp.net-mvc file-io

我正在处理我正在处理的ASP.NET MVC程序的文件更新部分。基本前提是程序将从用户处获取已编辑的图像,然后使用新数据更新旧文件,保留旧名称。但由于某种原因,当文件从临时文件夹移动到它应该去的文件夹时,它会保存为新文件,同时保留旧文件。 (例如,“foo 1-1.jpg”和“foo 1-1.jpg”存在于同一文件夹中)。据我所知,这两个文件名是相同的。为什么会发生这种情况,如何进行此操作以便首先删除旧文件?

我在移动它之前得到了旧的文件名,所以那里不应该有问题。也没有路径问题。

我不确定我传入的路径是否存在问题,但我使用相同的方法来获取文件路径,因此我不知道为什么它会因File.Delete而失败( )而不是File.Move()。

以下是相关代码:

/// <summary>
    /// Move a number of files to a single directory, keeping their names
    /// and overwriting if the switch is toggled.
    /// Will ignore nonexistent files, and return false if the specified directory does not exist.
    /// Returns true if it succeeded, false if it did not.
    /// </summary>
    /// <param name="filePaths">An array of filepath strings, </param>
    /// <param name="saveDirectory">The path to the directory to use</param>
    /// <param name="overWrite">Optional, defaults to false. Whether or not 
    /// to overwrite any existing files with the same name in the new directory. 
    /// If false, skips files that already exist in destination.</param>
    /// <returns>bool</returns>
    public static bool MoveSpecificFiles(string[] filePaths, string saveDirectory, bool overWrite = false)
    {
        //If the directory doesn't exist, error out.
        if (!Directory.Exists(saveDirectory))
        {
            return false;
        }
        string fileName;

        try
        {
            foreach (string filePath in filePaths)
            {
                //Check if the file to be moved exists. If it doesn't, skip it and go to the next one.
                if (File.Exists(filePath))
                {
                    fileName = Path.GetFileName(filePath);

                    //if the overwrite flag is set to true and the file exists in the new directory, delete it.
                    if (overWrite && File.Exists(saveDirectory + fileName))
                    {
                        //WHERE THE ERROR IS OCCURING
                        File.Delete(saveDirectory + fileName);
                    }
                    //If the file to be moved does not exist in the new location, move it there.
                    //This means that duplicate files will not be moved.
                    if (!File.Exists(saveDirectory + fileName))
                    {
                        File.Move(filePath, saveDirectory + fileName);
                    }
                }
                //throw new ArgumentException();
            }
        }
        catch (Exception)
        {
            //check = saveDirectory + " " + Path.GetFileName(filePaths[0]);
            return false;
        }
        return true;
    }

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我建议的唯一改进是使用Path.Combine方法生成正确的路径。使用此方法,您无需担心最后会错误/等。

var fullPath = Path.Combine(saveDirectory, fileName);
if (overWrite && File.Exists(fullPath))
{
   File.Delete(fullPath);
}

此外,由于您的if条件正在检查overWrite变量,因此请确保overWrite的值为true。我建议你放置visual studio断点并检查这个布尔变量的值和fullPath变量属性。

此外,我不确定saveDirectory变量的值是多少。如果它不是Web服务器上的完整物理文件路径,请考虑使用Server.MapPath来获取该路径。

答案 1 :(得分:0)

你确定你没有错过if-check的文件路径中的斜杠吗?

 if (overWrite && File.Exists(saveDirectory + fileName))

您可能希望尝试将代码更改为:

 if (overWrite && File.Exists(saveDirectory + "\\" + fileName))

答案 2 :(得分:0)

我发现了这个问题。当原始版本是.jpg文件时,File.Exists正在寻找.jpeg文件。因此,即使文件格式真的相同,File.Exists也找不到该文件。只是去展示,检查你的实际文件扩展名!