

例としては以下のコードとなります

[code]

    #include <filesystem>
    int main(){
        std::filesystem::copy_file("./t.txt","./test/t.txt",std::filesystem::copy_options::overwrite_existing);
    }
    
[/code]

./t.txt、./test共に存在しており、./test/t.txtのみ存在しない状態で2連続実行した所  
1度目は成功し 2度目は例外が投げられました

[code]

    terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
      what():  filesystem error: cannot copy file: File exists [./t.txt] [./test/t.txt]
    
[/code]

ライブラリ側のバグでしょうか？  
それとも自分の誤認識(またはミス)による物でしょうか？

また、余談ではありますが  
msvc(vs2019)、gcc(WSL(ubuntu18.04))では例外が投げられず、上書きが行われる事を確認しています

[環境]  
・OS:windows10  
・コンパイルオプション:両者ともに「-std=c++17」のみ  
・コンパイラ  
g++(msys2:mingw-w64-x86_64-toolchain)

[code]

    Using built-in specs.
    COLLECT_GCC=g++
    COLLECT_LTO_WRAPPER=C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/lto-wrapper.exe
    Target: x86_64-w64-mingw32
    Configured with: ../gcc-9.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev1, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
    Thread model: posix
    gcc version 9.3.0 (Rev1, Built by MSYS2 project)
    
[/code]

clang++(msys2:mingw-w64-x86_64-clang)

[code]

    clang version 9.0.1 (https://github.com/msys2/MINGW-packages.git 5e3b8820ed9f04221affee4197e458aca2612e87)
    Target: x86_64-w64-windows-gnu
    Thread model: posix
    InstalledDir: C:\msys64\mingw64\bin
    
[/code]


CC BY-SA 4.0
2020-04-04T14:40:10.530
65355
2020-04-05T10:37:29.183
2020-04-04T15:27:54.560
34557
34557
question
c++ mingw
mingwでfilesystem::copy_file()を使用した際、overwrite_existingを指定していても上書きが出来ません


ファイル"./t.txt"のプロテクションはどうなっていますか？

"./t.txt"が読み取り専用(書き込みができない)のファイルだと、それがコピーされた"./test/t.txt"も読み取り専用になります。

１回目の実行で、読み取り専用の"./test/t.txt"が作られて、２回目の実行で読み取り専用の"./test/t.txt"に書き込み(コピー)をしようとしたなら、質問のようなエラーが起こると思います。  
ファイルのパーミッションを確認してみてください。

"./t.txt"のパーミッションを書き込み可能に変更したら、同じエラーは起きなくなると思います。


CC BY-SA 4.0
2020-04-05T10:37:29.183
65363
2020-04-05T10:37:29.183
217
65355
answer