C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

半角文字のみで構成されているパスについて

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■88942 / inTopicNo.1)  半角文字のみで構成されているパスについて
  
□投稿者/ サティ (1回)-(2018/10/16(Tue) 18:11:03)

分類:[.NET 全般] 

言語:VB2013

僕が作成したアプリでは、別ツールをProcess起動で利用しているのですが、
このツールがエラーとなってしまう場合が判明しました。

このツールを使う際に、ツールで処理を行うファイルのパスを
コマンドライン引数に渡しているのですが、
指定したファイルが見つからない、というエラーです。

どうやら、コマンドライン引数に渡しているファイルパスに含まれる
「○○機能」フォルダ名の「能」の字が問題でした。
(いわゆるShift-JISの5c問題のようです。)

恐らく、ツール側ではANSIで受け取っているのでしょうが、
このツール自体を修正することはできません。
そこで、コマンドライン引数に渡すファイルパスに
2バイト文字が含まれないにようにすることを考えました。

例えば、本来ツールに渡したいファイルを一時ファイルにコピー
(System.IO.Path.GetTempFileName()メソッド等を利用)して、
一時ファイルのパスをツールに渡すことにより、
この問題を回避できたように思いましたが、
もしかしたら不十分かも知れません。

僕の環境では、一時ファイルは以下のフォルダ内に作成されます。

C:\Users\(ユーザ名)\AppData\Local\Temp

もし、万が一、ユーザ名に「能」や「表」などの5c問題文字が使われていたら
この問題が発生してしまいます。

そこで質問なのですが、
すべてのユーザがフルアクセス可能な、パスが半角文字だけとなるフォルダ、
というものは存在するのでしょうか?
対象OSはWindows7以降のWinFormアプリが動作するものに限定します。

また、5c問題が発生する文字を含む文字列を「裏技的」に
ツールのコマンドライン引数に渡す方法はないでしょうか?
単にパス文字の「能」文字の後に\を入れるだけではダメでした。
(\エスケープすればいいという訳にはいかないと思うので、そりゃそうだろうと思います。)

引用返信 編集キー/
■88943 / inTopicNo.2)  Re[1]: 半角文字のみで構成されているパスについて
□投稿者/ PANG2 (236回)-(2018/10/16(Tue) 18:19:00)
No88942 (サティ さん) に返信
> 例えば、本来ツールに渡したいファイルを一時ファイルにコピー
> (System.IO.Path.GetTempFileName()メソッド等を利用)して、
> 一時ファイルのパスをツールに渡すことにより、
> この問題を回避できたように思いましたが、
> もしかしたら不十分かも知れません。

ShortPathNameとか
https://dobon.net/vb/dotnet/file/getshortpath.html
引用返信 編集キー/
■88944 / inTopicNo.3)  Re[1]: 半角文字のみで構成されているパスについて
□投稿者/ 魔界の仮面弁士 (1877回)-(2018/10/16(Tue) 18:58:13)
2018/10/16(Tue) 19:16:38 編集(投稿者)

No88942 (サティ さん) に返信
> 「○○機能」フォルダ名の「能」の字が問題でした。
リパースポイントを使えないでしょうか。たとえば、
 D:\Downloads\○○機能\
のジャンクションを作成するために
 MKLINK /J D:\Downloads\○○KINO\ D:\Downloads\○○機能\
のコマンドを実行しておけば、
 D:\Downloads\○○機能\
 D:\Downloads\○○KINO\
のいずれでも、同じフォルダーを指し示すようになります。
http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html


> 例えば、本来ツールに渡したいファイルを一時ファイルにコピー
> (System.IO.Path.GetTempFileName()メソッド等を利用)して、
> 一時ファイルのパスをツールに渡すことにより、
> この問題を回避できたように思いましたが、
> もしかしたら不十分かも知れません。

環境変数 TEMP も含め、アプリ側の実装次第なので難しいところですね。
コピーすることによって、権限周りの問題が生じる可能性もありますし。



No88943 (PANG2 さん) に返信
> ShortPathNameとか
> https://dobon.net/vb/dotnet/file/getshortpath.html

ショートファイル名が付与されない設定になっているドライブを考慮しないとしても、
ShortPathName は、5C 問題(表,予,申,能,一,十,貼,ソ など)には
そのままでは効果が無いですね。


ただし下記を用いるなどして、対象パスのショートファイル名を、
"○○機能" から "○○KINO" に書き換えることはできますので、
そこまでして良いのなら、8+3 文字形式でのアクセスも有効かと思います。
https://intellitect.com/changing-short-file-names/


とはいえ、元のショートファイル名を変更すると、
他のアプリケーションへの影響も大きそうなので諸刃の剣。

いずれにしても、相手側のアプリケーション次第ですね。
引用返信 編集キー/
■88945 / inTopicNo.4)  Re[2]: 半角文字のみで構成されているパスについて
□投稿者/ サティ (2回)-(2018/10/16(Tue) 19:08:13)
No88943 (PANG2 さん) に返信
> ■No88942 (サティ さん) に返信
>>例えば、本来ツールに渡したいファイルを一時ファイルにコピー
>>(System.IO.Path.GetTempFileName()メソッド等を利用)して、
>>一時ファイルのパスをツールに渡すことにより、
>>この問題を回避できたように思いましたが、
>>もしかしたら不十分かも知れません。
>
> ShortPathNameとか
> https://dobon.net/vb/dotnet/file/getshortpath.html

ご回答ありがとうございます。
上記サイトを参考に、対象ファイルのパスを短いパス名にして、
これをツールのコマンドライン引数に渡してみましたが、
同様のエラーが発生しました。
フォルダ名に含まれる「機能」が、短いパス名でもそのままになってしまうことが原因のように思います。
(5c問題のないパス名であれば、短いパス名をツールに渡してもOKでした。)

引用返信 編集キー/
■88946 / inTopicNo.5)  Re[2]: 半角文字のみで構成されているパスについて
□投稿者/ サティ (3回)-(2018/10/16(Tue) 19:22:14)
No88944 (魔界の仮面弁士 さん) に返信
> ただし下記を用いるなどして、対象パスのショートファイル名を、
> "○○機能" から "○○KINO" に書き換えることはできますので、
> そこまでして良いのなら、8+3 文字形式でのアクセスも有効かと思います。
> https://intellitect.com/changing-short-file-names/
>
>
> とはいえ、元のショートファイル名を変更すると、他のアプリケーションへの
> 影響も大きそうです。その場合は、リパースポイントを併用するのも手かも。
> http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html
>
>
> いずれにしても、相手側のアプリケーション次第ですが。

ご回答ありがとうございます。
短いパス名を書き換えることもできるのですね。
ただ、これは「setsfn.exe」というアプリが必要なのですよね?
この方法の導入は難しそうです。
引用返信 編集キー/
■88947 / inTopicNo.6)  Re[3]: 半角文字のみで構成されているパスについて
□投稿者/ 魔界の仮面弁士 (1878回)-(2018/10/16(Tue) 19:25:16)
2018/10/16(Tue) 19:25:48 編集(投稿者)

No88946 (サティ さん) に返信
> ただ、これは「setsfn.exe」というアプリが必要なのですよね?
もしくは、それに相当する低レベル命令を自前で行うか。

> この方法の導入は難しそうです。
ジャンクションやシンボリックリンクなら、OS 標準のコマンドだけでいけますよ。
ドライブレターを変更しても良いなら、SUBST コマンドと言う手も。
引用返信 編集キー/
■88948 / inTopicNo.7)  Re[2]: 半角文字のみで構成されているパスについて
□投稿者/ サティ (4回)-(2018/10/16(Tue) 19:26:38)
No88944 (魔界の仮面弁士 さん) に返信
> 2018/10/16(Tue) 19:16:38 編集(投稿者)
>
> ■No88942 (サティ さん) に返信
>>「○○機能」フォルダ名の「能」の字が問題でした。
> リパースポイントを使えないでしょうか。たとえば、
>  D:\Downloads\○○機能\
> のジャンクションを作成するために
>  MKLINK /J D:\Downloads\○○KINO\ D:\Downloads\○○機能\
> のコマンドを実行しておけば、
>  D:\Downloads\○○機能\
>  D:\Downloads\○○KINO\
> のいずれでも、同じフォルダーを指し示すようになります。
> http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html

入れ違いになってしまいました。ありがとうございます。
これは試してみたいと思います。
ところで、元々「D:\Downloads\○○KINO\」というパスが存在した場合、

>  MKLINK /J D:\Downloads\○○KINO\ D:\Downloads\○○機能\

を実行するとどのようになるのでしょうか?
(人に質問する前に自分で試してみればいいのですが、初めてのことなので何だかコワくて...)
引用返信 編集キー/
■88949 / inTopicNo.8)  Re[3]: 半角文字のみで構成されているパスについて
□投稿者/ 魔界の仮面弁士 (1879回)-(2018/10/16(Tue) 19:30:29)
No88948 (サティ さん) に返信
> ところで、元々「D:\Downloads\○○KINO\」というパスが存在した場合、
>> MKLINK /J D:\Downloads\○○KINO\ D:\Downloads\○○機能\
> を実行するとどのようになるのでしょうか?

既にある名前と競合するということで、重複エラー扱いで生成されません。
引用返信 編集キー/
■88955 / inTopicNo.9)  Re[4]: 半角文字のみで構成されているパスについて
□投稿者/ サティ (5回)-(2018/10/17(Wed) 11:45:35)
No88949 (魔界の仮面弁士 さん) に返信
> ■No88948 (サティ さん) に返信
>>ところで、元々「D:\Downloads\○○KINO\」というパスが存在した場合、
> >> MKLINK /J D:\Downloads\○○KINO\ D:\Downloads\○○機能\
>>を実行するとどのようになるのでしょうか?
>
> 既にある名前と競合するということで、重複エラー扱いで生成されません。

早速ジャンクションというものを確認し、試してみました。
パスが重複しないように事前に確認してリンク名を決めることにより、
2バイト文字を含まないパスの生成に成功しました。
作成したジャンクションの削除もうまくいきました。

ありがとうございました。
解決済み
引用返信 編集キー/
■88957 / inTopicNo.10)  Re[5]: 半角文字のみで構成されているパスについて
□投稿者/ 774RR (632回)-(2018/10/17(Wed) 13:03:36)
ジャンクションもハードリンクも NTFS のドライブでないと作れないのでその辺は注意。
USB メモリのように FAT フォーマットされているドライブだとできないっすよ。
ネットワークドライブについてはどうだっけ? できない記憶がうっすらと。

まあ状況を選べば有意義っす。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ