[c#] File.Move가 작동하지 않음-파일이 이미 있습니다.

폴더가 있습니다.

c : \ test

이 코드를 시도하고 있습니다.

File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");

예외가 발생합니다.

존재하는 파일입니다

출력 디렉토리가 확실히 존재하고 입력 파일이 있습니다.



답변

폴더가 아닌 다른 파일로 이동해야하며 이름을 바꾸는 데 사용할 수도 있습니다.

움직임:

File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");

이름 변경 :

File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");

예제에서 “파일이 이미 존재합니다”라고 표시되는 이유 는 확장자가없는 C:\test\Test파일을 만들려고 Test하지만 같은 이름의 폴더가 이미 존재하므로 그렇게 할 수 없기 때문입니다.


답변

필요한 것은 :

if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
    File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}

또는

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");

이것은 다음 중 하나입니다.

  • 파일이 대상 위치에 존재하지 않는 경우 파일을 성공적으로 이동하거나;
  • 파일이 대상 위치에 존재하는 경우 삭제 한 다음 파일을 이동하십시오.

편집 : 가장 찬성표를 받았음에도 불구하고 내 대답을 명확히해야합니다! File.Move의 두 번째 매개 변수는해야한다 대상 파일하지 폴더. 두 번째 매개 변수를 대상 파일 이름이 아닌 대상 폴더로 지정 합니다. 이는 File.Move에 필요한 것입니다. 따라서 두 번째 매개 변수는 c:\test\Test\SomeFile.txt.


답변

개인적으로이 방법을 선호합니다. 이렇게하면 대상의 파일을 덮어 쓰고 원본 파일을 제거하며 복사가 실패 할 때 원본 파일이 제거되지 않도록합니다.

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
}


답변

P / Invoke를 수행하여 ( )에 대해 11MoveFileEx()전달할 수 있습니다.flagsMOVEFILE_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);

또는 전화를 걸 수 있습니다.

Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);

Microsoft.VisualBasic을 참조로 추가 한 후.


답변

파일이 실제로 존재하고 교체하려면 아래 코드를 사용하십시오.

string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"

if (File.Exists(moveTo))
{
    File.Delete(moveTo);
}

File.Move(file, moveTo);


답변

1) .Net Core 3.0 이상에서 C #을 사용하면 이제 세 번째 부울 매개 변수가 있습니다.

참조 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) 다른 모든 버전의 .Net의 경우 https://stackoverflow.com/a/42224803/887092 가 가장 좋은 답변입니다. 덮어 쓰기로 복사 한 다음 소스 파일을 삭제합니다. 원자 적 연산이되기 때문에 더 좋습니다. (나는 이것으로 MS Docs를 업데이트하려고 시도했습니다)


답변

File.Move대한 문서에 따르면 “존재하는 경우 덮어 쓰기”매개 변수가 없습니다. 대상 폴더 를 지정하려고했지만 전체 파일 사양을 제공해야합니다.

문서를 다시 읽으면 ( “새 파일 이름을 지정하는 옵션 제공”), 대상 폴더 사양에 백 슬래시를 추가하는 것이 작동 할 수 있다고 생각 합니다.