我正在处理我正在处理的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;
}
非常感谢任何帮助。
答案 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也找不到该文件。只是去展示,检查你的实际文件扩展名!