Bug #17626
closedFileUtils.cp may cause utime_failed
Description
FileUtils.cp will cause utime_failed if the file name contains Japanese characters and preserve is true.
This will probably only happen on Windows. It occures on Windows 10 version 2004 build 21301.1010.
require 'fileutils'
FileUtils.cp('foo', 'foo_copy', preserve: true)
FileUtils.cp('foo', 'fooコピー', preserve: true)
$ ruby test.rb
C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1424:in `utime': No such file or directory @ utime_failed - fooコピー (Errno::ENOENT)
from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1424:in `copy_metadata'
from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:515:in `copy_file'
from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:433:in `block in cp'
from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1597:in `block in fu_each_src_dest'
from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1613:in `fu_each_src_dest0'
from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:1595:in `fu_each_src_dest'
from C:/tools/ruby30/lib/ruby/3.0.0/fileutils.rb:432:in `cp'
from test.rb:4:in `<main>'
The expected result is copy to fooコピー is success same like copy to foo_copy.
Files
Updated by xtkoba (Tee KOBAYASHI) almost 4 years ago
I compiled the following code by x86_64-w64-mingw32-gcc
:
/* -*- coding: utf-8 -*- */
#include <stdio.h>
void touch(char *path) {
FILE *file = fopen(path, "a");
if (file != NULL) fclose(file);
}
int main() {
touch("fooコピー");
return 0;
}
and when I ran the output executable on Windows 10, I got a file with a funny name:
$ echo -n foo* | hexdump -C
00000000 66 6f 6f c3 a3 e2 80 9a c2 b3 c3 a3 c6 92 e2 80 |foo.............|
00000010 9d c3 a3 c6 92 c2 bc |.......|
00000017
When I ran the following Ruby script in the directory where the funny file exists, then I got no errors:
# -*- coding: utf-8 -*-
File.utime 0, 0, "fooコピー"
I cannot summarize this phenomenon, but I think it has something to do with the main issue.
Updated by xtkoba (Tee KOBAYASHI) almost 4 years ago
- File ruby-w32_utimensat.patch ruby-w32_utimensat.patch added
I have found a solution to this issue. See the attached patch.
BTW I didn't know that special functions must be used to handle non-ASCII filenames with MinGW.
Updated by nobu (Nobuyoshi Nakada) almost 4 years ago
- Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN to 2.5: DONTNEED, 2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED
Updated by xtkoba (Tee KOBAYASHI) almost 4 years ago
- Status changed from Open to Closed
Applied in changeset git|a681c484a3c5b9235c84bc5c253b4406e498e8cf.
Fixed codepage for utime [Bug #17626]
Should use the given codepage argument.
Co-Authored-By: Nobuyoshi Nakada nobu@ruby-lang.org
Updated by agate-pris (agate pris) almost 4 years ago
Thank you very much!
Updated by naruse (Yui NARUSE) almost 4 years ago
- Backport changed from 2.5: DONTNEED, 2.6: DONTNEED, 2.7: DONTNEED, 3.0: REQUIRED to 2.5: DONTNEED, 2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONE
ruby_3_0 551f1236a43ad014522d120dea1f136052879c0a merged revision(s) a681c484a3c5b9235c84bc5c253b4406e498e8cf.