Eu tenho uma pasta:
c: \ teste
Estou tentando este código:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Eu recebo uma exceção:
O arquivo já existe
O diretório de saída definitivamente existe e o arquivo de entrada está lá.
Eu tenho uma pasta:
c: \ teste
Estou tentando este código:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Eu recebo uma exceção:
O arquivo já existe
O diretório de saída definitivamente existe e o arquivo de entrada está lá.
Respostas:
Você precisa movê-lo para outro arquivo (em vez de uma pasta), isso também pode ser usado para renomear.
Mover:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Renomear:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
O motivo pelo qual diz "Arquivo já existe" em seu exemplo é porque C:\test\Test
tenta criar um arquivo Test
sem uma extensão, mas não consegue porque já existe uma pasta com o mesmo nome.
O que você precisa é:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
ou
if (File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Delete(@"c:\test\Test\SomeFile.txt");
}
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Isso irá:
Edit: Devo esclarecer minha resposta, embora seja a mais votada! O segundo parâmetro de File.Move deve ser o arquivo de destino - não uma pasta. Você está especificando o segundo parâmetro como a pasta de destino, não o nome do arquivo de destino - que é o que File.Move requer. Portanto, seu segundo parâmetro deve ser c:\test\Test\SomeFile.txt
.
Pessoalmente, prefiro esse método. Isso substituirá o arquivo no destino, removerá o arquivo de origem e também impedirá a remoção do arquivo de origem quando a cópia falhar.
string source = @"c:\test\SomeFile.txt";
string destination = @"c:\test\test\SomeFile.txt";
try
{
File.Copy(source, destination, true);
File.Delete(source);
}
catch
{
//some error handling
}
File.Copy , File.Delete
mais File.Move
?
Você pode fazer um P / Invoke para MoveFileEx()
- passar 11 para flags
( MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH
)
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
static extern bool MoveFileEx(string existingFileName, string newFileName, int flags);
Ou você pode apenas ligar
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
após adicionar Microsoft.VisualBasic como uma referência.
Se o arquivo realmente existe e você deseja substituí-lo, use o código abaixo:
string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"
if (File.Exists(moveTo))
{
File.Delete(moveTo);
}
File.Move(file, moveTo);
De acordo com os documentos para File.Move, não há parâmetro "sobrescrever se existir". Você tentou especificar a pasta de destino , mas deve fornecer a especificação completa do arquivo.
Lendo os documentos novamente ("fornecendo a opção de especificar um novo nome de arquivo"), eu acho , adicionar uma barra invertida às especificações da pasta de destino pode funcionar.
Move(String, String, Boolean)
. mas isso parece ser um erro?
1) Com C # no .Net Core 3.0 e além, agora há um terceiro parâmetro booleano:
consulte https://docs.microsoft.com/en-us/dotnet/api/system.io.file.move?view=netcore-3.1
In .NET Core 3.0 and later versions, you can call Move(String, String, Boolean) setting the parameter overwrite to true, which will replace the file if it exists.
2) Para todas as outras versões do .Net, https://stackoverflow.com/a/42224803/887092 é a melhor resposta. Copie com sobrescrever e exclua o arquivo de origem. Isso é melhor porque torna uma operação atômica. (Eu tentei atualizar o MS Docs com isso)
Experimente Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. O último parâmetro é a opção Overwrite, que System.IO.File.Move
não tem.
Se você não tem a opção de excluir o arquivo já existente no novo local, mas ainda precisa mover e excluir do local original, este truque de renomeação pode funcionar:
string newFileLocation = @"c:\test\Test\SomeFile.txt";
while (File.Exists(newFileLocation)) {
newFileLocation = newFileLocation.Split('.')[0] + "_copy." + newFileLocation.Split('.')[1];
}
File.Move(@"c:\test\SomeFile.txt", newFileLocation);
Isso pressupõe o único '.' no nome do arquivo está antes da extensão. Ele divide o arquivo em dois antes da extensão e anexa "_copy". entre. Isso permite que você mova o arquivo, mas cria uma cópia se o arquivo já existe ou uma cópia da cópia já existe, ou uma cópia da cópia da cópia existe ...;)