System.IO.File.Move错误-找不到路径的一部分

本文关键字:找不到 路径 一部分 错误 IO File Move System | 更新日期: 2023-09-27 18:10:18

我有一个同步软件,它从"传入"文件夹,处理它们,然后将它们移动到"归档";文件夹。

今天,我看到这个同步软件出现了以下错误:

[23/06/2014 00:06:04 AM]:从

移动文件失败

D: ' IBI_ORDER_IMPORTER_FTP_SERVER ' Template3 '五十,院长传入' ' 5 a040k___d6f1ca45937b4ceb98d29d0db4601bf4.csv

D: ' IBI_ORDER_IMPORTER_FTP_SERVER ' Template3 '五十,Dean'Archive'5A040K___d6f1ca45937b4ceb98d29d0db4601bf4.csv - 无法查找路径的一部分

这是从同步软件中截取的一个片段,文件在其中被处理和移动:

public static void ProcessSingleUserFile(Int32 TemplateId, String ImportedBy, String FilePath)
{
    // Always Rename File To Avoid Conflict
    string FileName = Path.GetFileNameWithoutExtension(FilePath);
    String NewFilePath = FilePath.Replace(FileName, Utils.RandomString() + "___" + FileName);
    File.Move(FilePath, NewFilePath);
    FilePath = NewFilePath;
    // Log
    SyncUtils.ConsoleLog(String.Format("Processing [ {0} as {1} ] By [ {2} ] On Template [ #{3} ]",
        FileName + ".csv",
        Path.GetFileName(FilePath),
        ImportedBy,
        TemplateId));
    // Init
    List<OrderDraft> myOrderDrafts = new List<OrderDraft>();
    // Parsed Based On Template Id
    if (TemplateId == Settings.Default.Multi_Order_Template_Id)
    {
        // Try Parse File
        myOrderDrafts = Utils.ParseMultiImportFile(TemplateId, ImportedBy, FilePath, true);
    }
    else
    {
        // Try Parse File
        myOrderDrafts.Add(Utils.ParseImportFile(TemplateId, ImportedBy, FilePath, true));
    }
    // Process Orders
    foreach (OrderDraft myOrderDraft in myOrderDrafts)
    {
        /* code snipped */
    }
    // Archive File
    File.Move(FilePath, FilePath.Replace("Incoming", "Archive"));
}

你知道这个错误是什么意思吗?如何规避呢?


我写了上面的一个精简版本,在一个受控的环境中测试,我没有得到这个代码的错误:

static void Main(string[] args)
{
    try
    {
        string baseDir = @"C:'Users'Administrator'Desktop'FTP_SERVER'Template3'Fifty & Dean'Incoming'";
        string[] filePaths = Directory.GetFiles(baseDir, "*.csv");
        foreach (string filePath in filePaths)
        {
            // do some work here ...
            // move file
            string newFilePath = filePath.Replace("Incoming", "Archive");
            File.Move(filePath, newFilePath);
            Console.WriteLine("File successfully moved");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: " + ex.Message);
    }
    Console.ReadKey();
}

System.IO.File.Move错误-找不到路径的一部分

您需要包含检查以确保运行时路径存在,并检查输出,非常简单,如:

if(!Directory.Exists(Path.GetDirectoryName(filePath)))
{
   Console.WriteLine("filePath does not exist: " + filePath);
}
if(!Directory.Exists(Path.GetDirectoryName(newFilePath)))
{
   Console.WriteLine("newFilePath does not exist: " + newFilePath);
}
File.Move(filePath, newFilePath);

我建议这种方法的原因是由于路径在多任务操作系统下暂时可用或不可用的可能性,这取决于多种因素:网络连接,权限(随时由GPO推下),防火墙规则,AV排除被吹走等。即使运行低CPU或RAM也可能产生问题。简而言之,如果您只是在事后检查路径的可用性,那么您永远不会知道代码运行时究竟发生了什么。

或者如果您的问题是间歇性的,您可以尝试捕获错误并将信息写入类似于下面的某种日志:

try
{
    File.Move(filePath, newFilePath);
}
catch(Exception ex)
{
    if(!Directory.Exists(Path.GetDirectoryName(filePath)))
    {
       Console.WriteLine("filePath does not exist: " + filePath);
    }
    if(!Directory.Exists(Path.GetDirectoryName(newFilePath)))
    {
       Console.WriteLine("newFilePath does not exist: " + newFilePath);
    }
}

"无法找到路径的一部分"如果使用的参数长于。net框架中的MAX_PATH(260),也可能从File.Move抛出异常。

因此,在传递到File.Move之前,我用长路径语法添加了我使用的路径,并且它有效。

// Prepend long file path support
if( !packageFile.StartsWith( @"''?'" ) )
    packageFile = @"''?'" + packageFile;

看:如何处理文件名长于259个字符的文件?

我有这个

找不到路径的一部分

发生在我身上

File.Move(mapfile_path , Path.Combine(newPath, mapFile));

。经过一些测试,我发现我们的服务器管理员阻止了任何用户应用程序写入[newPath]中的目录!

因此,右键单击该目录,观察安全选项卡中的权限矩阵,以查看任何可能阻止您的内容

导致DirectoryNotFoundException "无法找到部分路径"的另一个原因;由文件抛出。Move可以是目录名末尾的空格。考虑下面的代码:

string destinationPath = "C:''Folder1 ";        //note the space on the end
string destinationFileNameAndPath = Path.Combine(destinationPath, "file.txt");
if (!Directory.Exists(destinationPath))
    Directory.CreateDirectory(destinationPath);
File.Move(sourceFileNameAndPath, destinationFileNameAndPath);

您可能期望这段代码成功,因为如果目标目录不存在,它将创建目标目录,但是directory。CreateDirectory似乎修剪了目录名称末尾的额外空间,而File。Move没有,并给出上述异常。

在这种情况下,你可以通过自己修剪额外的空间来解决这个问题,例如

string destinationPath = "C:''Folder1 ".Trim();