Opened 6 years ago

Closed 6 years ago

#6809 closed Bugs (fixed)

Implementation of filesystem::rename() method for MS Windows is wrong

Reported by: Sergey Kazakov <sergeyyk@…> Owned by: Beman Dawes
Milestone: To Be Determined Component: filesystem
Version: Boost 1.48.0 Severity: Problem
Keywords: filesystem rename windows Cc:


simple program:

try {

boost::filesystem::rename( "c:\1.txt", "d:\1.txt" );

} catch( boost::filesystem::filesystem_error& e ) {

std::cout << "filesystem_error: " << e.what();


output: filesystem_error: boost::filesystem::rename: The system cannot move the file to a different disk drive: "c:\1.txt", "d:\1.txt"

The problem is caused by BOOST_MOVE_FILE macro definition in \libs\filesystem\v3\src\operations.cpp file


According to MSDN: When moving a file, the destination can be on a different file system or volume. If the destination is on another drive, you must set the MOVEFILE_COPY_ALLOWED flag in dwFlags.

Without this flag MoveFileEx?() method fails with error code 0x11 ("The system cannot move the file to a different disk drive").

So bug can be fixed in following way # define BOOST_MOVE_FILE(OLD,NEW)(::MoveFileExW(OLD, NEW, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED)!= 0)

Please find a patch attached.

Attachments (1)

libs_filesystem_src_operations.cpp.patch (774 bytes) - added by Sergey Kazakov <sergeyyk@…> 6 years ago.

Download all attachments as: .zip

Change History (2)

Changed 6 years ago by Sergey Kazakov <sergeyyk@…>

comment:1 Changed 6 years ago by Beman Dawes

Resolution: fixed
Status: newclosed

(In [78078]) Filesystem: Fix #6809, Implementation of filesystem::rename() method for MS Windows is wrong, by adding MOVEFILE_COPY_ALLOWED to deal with renames across drives, volumes, file systems. Fix has no effect on non-Windows systems.

Modify Ticket

Change Properties
Set your email in Preferences
as closed The owner will remain Beman Dawes.
The resolution will be deleted.

Add Comment

E-mail address and name can be saved in the Preferences.

Note: See TracTickets for help on using tickets.