폴더가 있습니다.
c : \ test
이 코드를 시도하고 있습니다.
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
예외가 발생합니다.
존재하는 파일입니다
출력 디렉토리가 확실히 존재하고 입력 파일이 있습니다.
폴더가 있습니다.
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
}
File.Copy , File.Delete
이상 File.Move
?
P / Invoke를 수행하여 ( )에 대해 11 을 MoveFileEx()
전달할 수 있습니다.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);
또는 전화를 걸 수 있습니다.
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
Microsoft.VisualBasic을 참조로 추가 한 후.
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를 업데이트하려고 시도했습니다)
Move(String, String, Boolean)
대신 전화하십시오 . 하지만 그게 실수 인 것 같나요?
시도해보십시오 Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. 마지막 매개 변수는 Overwrite 스위치 System.IO.File.Move
입니다.
새 위치에서 이미 존재하는 파일을 삭제할 수있는 옵션이 없지만 원래 위치에서 이동 및 삭제해야하는 경우이 이름 변경 트릭이 작동 할 수 있습니다.
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);
이것은 유일한 '.' 파일 이름에서 확장자 앞에 있습니다. 확장자 앞에 두 개로 파일을 분할하고 "_copy"를 첨부합니다. 사이. 이렇게하면 파일을 이동할 수 있지만 파일이 이미 존재하거나 사본의 사본이 이미 존재하거나 사본의 사본이 존재하는 경우 사본을 작성합니다 ...;)