Armadilloフォーラム

ファイル名に0x5Cや0x7Cが入る場合

yue110

2016年9月30日 18時23分

御世話になっております。

御質問させていただきます。

現在、SDカードにファイルを作成して各種データを保存しています。
ファイル名を任意に設定できるようにしてあり、全角文字も設定できるようにしています。
そこで、0x5Cや0x7Cが入ると、正常にファイルを作成する事が出来なくなってしまい、
エラーとなってしまいます。

円マーク(0x5C)を一つ追加するなども試してみましたが、どうもうまくいきません。
なにか良い手はないでしょうか?

よろしくお願い致します。

コメント

k.sato

2016年10月3日 13時14分

yue110と共同で作業しております佐藤です。

詳しく説明しますと、
シフトJISで入力された文字列を使用してファイル名を作成し、
SDカードに保存するときの問題です。

SDカードはvfatでフォーマットされており、
0x5Cが含まれるものはfopenの段階でエラーとなります。

同じファイル名でも
ext3でフォーマットしたSDカードには保存できているのですが関係あるのでしょうか?

またvfatのSDカードに0x5C、0x7Cが含まれる2バイト文字をファイル名にするのは
不可能なのでしょうか?

以上、よろしくお願い致します。

at_yashi

2016年10月3日 13時23分

> またvfatのSDカードに0x5C、0x7Cが含まれる2バイト文字をファイル名にするのは
> 不可能なのでしょうか?

VFATの場合は、code page を選択しないとダメだったりしますか?
ATDEで同じ SDを mount した場合は、どうなりました?

カーネルコンフィグの File systems → DOS/FAT/NT Filesystems です。

k.sato

2016年10月3日 15時58分

回答ありがとうございます。

> VFATの場合は、code page を選択しないとダメだったりしますか?
Armadilloでマウント時にオプションでfmaskしか指定せず、下記のようになっていました。
/dev/mmcblk0p1 on /home/ftp/pub type vfat (rw,fmask=0111,dmask=0002,allow_utime=0020,codepage=cp437,iocharset=iso8859-1)
このとき添付したFilesystem.jpgの値が設定されるのでしょうか?

> ATDEで同じ SDを mount した場合は、どうなりました?
すみません。ATDE上でSDをどうやってmountするのかわかりません。
教えて頂けませんか?

ファイル ファイルの説明
Filesystems.jpg カーネル_DOS/FAT/NT Filesystems_画面キャプチャ

y.nakamura

2016年10月3日 16時51分

中村です。

linux-2.6.26-atXX/fs/vfat/namei.c
に次のようなコードがあります。

/* Characters that are undesirable in an MS-DOS file name */
static inline wchar_t vfat_bad_char(wchar_t w)
{
        return (w < 0x0020)
            || (w == '*') || (w == '?') || (w == '<') || (w == '>')
            || (w == '|') || (w == '"') || (w == ':') || (w == '/')
            || (w == '\\');
}

ファイルやディレクトリのcreateやrenameなどで
使われるみたいです。

--
なかむら

k.sato

2016年10月4日 11時59分

佐藤です。
中村様ありがとうございます。

> linux-2.6.26-atXX/fs/vfat/namei.c
> に次のようなコードがあります。
>
>

> /* Characters that are undesirable in an MS-DOS file name */
> static inline wchar_t vfat_bad_char(wchar_t w)
> {
>         return (w < 0x0020)
>             || (w == '*') || (w == '?') || (w == '<') || (w == '>')
>             || (w == '|') || (w == '"') || (w == ':') || (w == '/')
>             || (w == '\\');
> }
> 

シフトJISの全角で0x5Cと0x7Cが含まれるときは
t vfat_bad_char()を呼ばないよう変更してみました。

無事、全角の0x5Cと0x7Cを含むファイル名でファイル作成することができました。

ありがとうございました。