Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对文件名进行版本控制并将其保存到其他位置_C# - Fatal编程技术网

C# 对文件名进行版本控制并将其保存到其他位置

C# 对文件名进行版本控制并将其保存到其他位置,c#,C#,在else块之后Path.Combine方法在Console.WriteLine(结果)时组合每个部分并给出文件名被使用。但它实际上并没有创建具有该名称的文件 我想获取EmployeeDetails.txt文件,制作一个版本(即重命名文件名),并将其保存到C:\Hitory文件夹中 如何做到这一点 使用File.Move抛出FileNotFoundexception void ModRec() { string filename = @"C:\Curren

在else块之后
Path.Combine
方法在
Console.WriteLine(结果)时组合每个部分并给出文件名被使用。但它实际上并没有创建具有该名称的文件

我想获取EmployeeDetails.txt文件,制作一个版本(即重命名文件名),并将其保存到
C:\Hitory
文件夹中

如何做到这一点

使用
File.Move
抛出
FileNotFoundexception

void ModRec()       
{     
        string filename = @"C:\Current\EmployeeDetails.txt";
        string current = @"C:\Current\";
        string history = @"C:\History\";
        FileInfo fileinfo = new FileInfo(filename);
        if (fileinfo.Exists)
        {
            if (!Directory.Exists(history))
            {
                Directory.CreateDirectory(history);
            }
        }
        else
        {
            Console.WriteLine("\t\t\tFile doesn't exist!");
            Console.ReadLine();
            Menu1();
        }
        var extension = Path.GetExtension(filename);
        var fileNamePart = Path.GetFileNameWithoutExtension(filename); 
        var path = Path.GetDirectoryName(filename); 
        var version = 0; 
        string result;
        do
        {
            version++;
            result = Path.Combine(path, fileNamePart + "_" + version + extension); 
        }
        while (File.Exists(result));
        //File.Move(current, history);
    }
Path.Combine()
根本不涉及文件系统。不会将任何文件/文件夹装入板条箱

尝试
File.Move(文件名、历史记录)。也就是说,移动文件(假设
filename
是完整路径)而不是作为目录的
current

尝试以下操作:

void ModRec()       
{     
        string filename = @"C:\Current\EmployeeDetails.txt";
        string current = @"C:\Current\";
        string history = @"C:\History\";
        FileInfo fileinfo = new FileInfo(filename);
        if (fileinfo.Exists)
        {
            if (!Directory.Exists(history))
            {
                Directory.CreateDirectory(history);
            }
        }
        else
        {
            Console.WriteLine("\t\t\tFile doesn't exist!");
            Console.ReadLine();
            Menu1();
        }
        var extension = Path.GetExtension(filename);
        var fileNamePart = Path.GetFileNameWithoutExtension(filename); 
        var path = Path.GetDirectoryName(filename); 
        var version = 0; 
        string result;
        do
        {
            version++;
            result = Path.Combine(history, fileNamePart + "_" + version + extension); 
        }
        while (File.Exists(result));
        File.Move(filename, result);
    }

最后的循环需要稍微更改,因为

    result = Path.Combine(path, fileNamePart + "_" + version + extension); 
正在查找文件所在的目录,而不是您希望它所在的历史目录,因此您将在错误的位置扫描重复项。因此,
路径.Combine
需要引用
历史记录的值

    result = Path.Combine(history, fileNamePart + "_" + version + extension); 
其次,您不能使用
Move
将文件移动到目录,方法与从命令行移动文件相同,您需要将这两个参数指定为文件名,因此

 File.Move(current, history);
变成

 File.Move(filename, result);
因此,方法末尾的结果代码应该如下所示:

do
{
    version++;
    result = Path.Combine(history, fileNamePart + "_" + version + extension); 
}
while (File.Exists(result));
File.Move(filename, result);
顺便说一句,如果测试文件是否已经存在,只需调用
Menu1
,然后继续。您能保证这将确保用户下一步所做的事情将创建一个有效的文件吗?我猜它很可能无法保证这一点,因此您应该在此时退出您的方法,或者将正文的其余部分放在
fileinfo.Exists
块中


这使得从这个方法内部调用菜单的可取性,但这是一个超出了您在这里所问范围之外的设计问题。

代码没有什么意义。即使文件不存在,也可以调用File.Move()。当然它会抱怨。首先,
result
永远不会被创建。其次,
File.Move(current…
其中current是一个目录??这将不起作用,因为File.Move()的第二个参数需要是目标文件的路径,而不是目标目录的路径。此外,这将忽略整个版本代码。它还将当前文件夹EmployeeDetails.txt中的文件名更改为EmployeeDetails_1.txt,并将文件复制到历史文件夹。我不想更改当前文件夹中的文件名。此代码将C:\Current\EmployeeDetails.txt移动到C:\History\EmployeeDetails.txt。请注意,不仅带
File.Move(…
的行已更改,而且
result=…
行已更改为
result=Path.Combine(历史记录,fileNamePart+“\u”+版本+扩展名);
它还将当前文件夹EmployeeDetails.txt中的文件名更改为EmployeeDetails_1.txt,并将文件复制到历史文件夹中。我不想更改当前文件夹中的文件名。您的原始代码确实这样做了,但这个答案没有-它只是将其从
当前
文件夹移动到
历史
文件夹,这是您说过要实现的。但是,如果您现在说要将文件复制到历史记录文件夹,那么您应该编写一个采用源文件名和目标文件名的
FileCopy
方法,并将其替换为
file.Move
。谢谢!@ClickRick!“file.copy”有效。问题已解决。