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

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

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

VB.NET ファイル出力時の大文字小文字の区別について

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

■100749 / inTopicNo.1)  VB.NET ファイル出力時の大文字小文字の区別について
  
□投稿者/ ゆうたろう (1回)-(2022/10/24(Mon) 14:50:57)

分類:[VB.NET/VB2005 以降] 

Visual Studio 2015を利用して既存のプログラムを修正しています。

CreateDirectory("出力ファイル名")を用いて、
同じパスのディレクトリがなければ新規に、あればその直下にデータを出力しているのですが、
言語特性上大文字小文字の区別が付かないようで、
例えば"AAA"ファイルとは別に"aaa"ファイルを出力したいのに、"AAA"の中に"aaa"の情報が書き込まれてしまいます。

大文字小文字を区別してファイルパスを取得することはできたのですが、
書き込む際には区別されないということなので、困っています。

CreateDirectory以外に適したメソッド等はありますでしょうか?
あるいは何かヒントがありましたら、ご教授願います。

もし解決策がなければ、パス入力時に大文字小文字の区別が付かないことを明記する形で妥協しようと考えております。

当方.NETおよび大規模開発は初心者なもので、
分かりづらい点がありましたら申し訳ありません。
引用返信 編集キー/
■100751 / inTopicNo.2)  Re[1]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ トット (2回)-(2022/10/24(Mon) 15:23:09)
ファイル名の大文字小文字が区別されないのはファイルシステムの仕様なのでC#で作ってもJavaで作っても同じようになりますよ、そういうものです
引用返信 編集キー/
■100753 / inTopicNo.3)  Re[1]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ 魔界の仮面弁士 (3474回)-(2022/10/24(Mon) 16:48:00)
No100749 (ゆうたろう さん) に返信
> CreateDirectory("出力ファイル名")を用いて、
My.Computer.FileSystem.CreateDirectory のことでしょうか?
System.IO.Directory.CreateDirectory のことでしょうか?

いずれにせよ、これらの引数に指定すべき文字列は
「ファイル名」を含むパスではなく
「ディレクトリ名」のパスですよ?


> 言語特性上大文字小文字の区別が付かないようで、
Windows 環境のファイルシステムでは、
半角の大文字小文字は同一視されます。
全角の大文字小文字については環境依存です。

後者は、使用している OS およびそのドライブのファイルシステムによって
区別される場合と同一視される場合があるということです。


また、ネットワーク上のパスだと、相手側の OS によっては
半角の大文字小文字が区別されるケースもあります。


試しに Windows エクスプローラーで、任意の場所に
"AaAa" というフォルダーを作ってみてください。

A:全角大文字エー
a:全角小文字エー
A:半角大文字エー
a:半角小文字エー

その後、同じ場所に "aAaA" フォルダーを作ってみてください。

a:全角小文字エー
A:全角大文字エー
a:半角小文字エー
A:半角大文字エー


これらが別物として生成できる環境もあれば、同一フォルダーと認識されて
警告(あるいは統合の確認)が表示される場合もあります。


> 大文字小文字を区別してファイルパスを取得することはできたのですが、
どうやって取得しましたか?

> 書き込む際には区別されないということなので、困っています。
どうやって書き込みましたか?

引用返信 編集キー/
■100770 / inTopicNo.4)  Re[2]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ ゆうたろう (3回)-(2022/10/25(Tue) 11:18:42)
2022/10/25(Tue) 11:31:41 編集(投稿者)

No100753 (魔界の仮面弁士 さん) に返信

細かい回答感謝したします。
おかげで思考が整理できました。


> My.Computer.FileSystem.CreateDirectory のことでしょうか?
> System.IO.Directory.CreateDirectory のことでしょうか?
後者のようです。
素人質問で恐縮ですが、この2つに結果としてどのような違いが生まれるのでしょうか?
差し支えなければご教授いただきたいです。


> いずれにせよ、これらの引数に指定すべき文字列は
> 「ファイル名」を含むパスではなく
> 「ディレクトリ名」のパスですよ?
おっしゃる通りでした。


> Windows 環境のファイルシステムでは、
であれば、VB.NET2015での開発、およびWindowsOSがインストールの推奨環境とのことなので、
環境差はあまり考慮しなくてもよいという認識であっていますか?


> どうやって取得しましたか?
https://threeshark3.com/case-sensitive-path/
こちらを参考に取得しました。

ただ、本件では取得する必要は全くない(あるのかもしれませんが、、)ので、
大文字小文字の判別自体はできるんだなぁ、と参考程度に行ったまでです。


> どうやって書き込みましたか?
勘違いがありました。コードをよく確認したら、
 If Not System.IO.Directory.Exists(パス) Then
  System.IO.Directory.CreateDirectory(パス)
 End If
となっておりました。
その下にファイル作成のメソッドが並んでいます。

また、書き込み自体も、大文字小文字は正確に出力されていて、
あくまで、「ディレクトリがあるかの判別時に同じものだと判断されたため、ディレクトリが作成されず、既存のものの下にファイルができてしまう」
ということが問題のようでした。


上記に関してですが、
System.IO.File.Existsメソッドにおいて、大文字小文字を区別して取得する方法、
あるいは代替できるメソッドがあれば解決するかも。と考えましたが、
そのような方法はありますでしょうか?

引用返信 編集キー/
■100772 / inTopicNo.5)  Re[3]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ KOZ (334回)-(2022/10/25(Tue) 13:05:45)
No100770 (ゆうたろう さん) に返信
> System.IO.File.Existsメソッドにおいて、大文字小文字を区別して取得する方法、
> あるいは代替できるメソッドがあれば解決するかも。と考えましたが、
> そのような方法はありますでしょうか?

「大文字と小文字の区別を調整する」
https://learn.microsoft.com/ja-jp/windows/wsl/case-sensitivity

Windows 10、ビルド 17107 から区別できるよう設定が可能らしいです。
試してみて報告していただけるとありがたいです。

引用返信 編集キー/
■100774 / inTopicNo.6)  Re[3]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ 魔界の仮面弁士 (3479回)-(2022/10/25(Tue) 14:07:27)
No100770 (ゆうたろう さん) に返信
>>My.Computer.FileSystem.CreateDirectory のことでしょうか?
>>System.IO.Directory.CreateDirectory のことでしょうか?
> 後者のようです。

その 2 つのメソッド以外にも、同じ名前で
CreateDirectory API(Wide版/ANSI版)という物があります。
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createdirectoryw
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createdirectorya


> 素人質問で恐縮ですが、この2つに結果としてどのような違いが生まれるのでしょうか?
機能的にはほぼ同等です。

ただし、戻り値の有無が異なります。
前者は Sub CreateDirectory(directory As String) なのに対して
後者は Function CreateDirectory(directory As String) As System.IO.DirectoryInfo です。

また、引数検査手続きに関しても若干の違いがあります。
分かりやすい差としては、たとえばその場所に同名の "ファイル" が存在していた場合に
下記のように、例外の内容が微妙に異なってしまう事がある…といった具合にです。

System.IO.IOException「ファイルがこのパス 'D:\temp.txt' 内に既に存在するため、操作を完了できませんでした。」
System.IO.IOException「同じ名前のファイルまたはディレクトリが既に存在するため、"D:\temp.txt" を作成できません。」


とはいえ、My.Computer.FileSystem.CreateDirectory は、
内部で System.IO.Directory.CreateDirectory を呼び出すようになっていますから、
本質的な違いは無いと言って差し支えないでしょう。


そしてその System.IO.Directory.CreateDirectory にしても、内部では最終的に
先の CreateDirectory という Win32 API を呼び出すようになっています。
Win32 API としては指定できるパスであっても、System.IO.Directory.CreateDirectory だと
事前チェックに引っ掛かってしまい、呼び出せないというケースはありえますね。
それを気にする必要があるかは別として。


> であれば、VB.NET2015での開発、およびWindowsOSがインストールの推奨環境とのことなので、
> 環境差はあまり考慮しなくてもよいという認識であっていますか?
気にするべきは「開発環境」よりも「実行環境」の方です。
最終判断は御自身で行って頂きたい所ですが、ほとんどの場合は考慮しなくても良いでしょう。

実行環境後の微妙な環境依存性はあるとしてもレアケースでしょうし、
その場合も細かく対応しようとはせず、『そういう仕様である』ということで
割り切って運用しておくぐらいで十分かと思いますよ。


うろ覚えですが、実行環境が Windows 98 (.NET Framework 2.0 までサポート) + VFAT or FAT32 という
環境だと、全角パスの大文字小文字の判定に差異が生じるケースがあったように記憶しています。
今だと Windows 10/11 + NTFS が多いでしょうね。出力先が USB メモリの場合は exFAT だったりしますが。

古い NetWare サーバー上に格納しようとした場合、すべて大文字扱いになってしまう上に、
長いファイル名を使えない(8.3形式のみ)というパターンも過去にはありました。
今時、そんなサーバーを使うことはまずありえないでしょうけれども。

あとは、半角の大文字小文字も区別されるケースとして、WSL (Windows Subsystem for Linux) が
有りそうですが、こちらも \\WSL$\ とか使っていないでしょうし、やはり今回は考慮する必要性は少ない気がします。
https://kledgeb.blogspot.com/2018/06/wsl-155.html
https://learn.microsoft.com/ja-jp/windows/wsl/case-sensitivity


> If Not System.IO.Directory.Exists(パス) Then
>   System.IO.Directory.CreateDirectory(パス)
> End If
この If 判定は無くても動きますね。
Directory.CreateDirectory に、既に存在しているディレクトリを渡しても
特にエラーになったりはしませんので。

ファイル名とディレクトリ名の誤指定を防ぐ意味で、
File.Exits を使う(Directory.Exists ではなく)といったケースはありますし、
ディレクトリ作成前の、内部的な権限その他のチェックを少しでも減らすために
事前チェックをするということはありますが…そうしたチェックも
Directory.CreateDirectory 側が面倒を見てくれます。


仮に事前チェックしたとしても、権限不足で書き込めなかったなどの事情で
エラーになることはあるので、どちらにしても Try 句などによる例外処理は必須です。

なので、事前チェックにあまりこだわらずに、例外処理で対処した上で、
本題の「大文字小文字を区別するかどうか」も、それぞれの環境ごとの動作として
運用側の対処で乗り切った方が良いとは思います。
引用返信 編集キー/
■100789 / inTopicNo.7)  Re[4]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ ゆうたろう (4回)-(2022/10/27(Thu) 09:05:29)
No100772 (KOZ さん) に返信

> Windows 10、ビルド 17107 から区別できるよう設定が可能らしいです。
> 試してみて報告していただけるとありがたいです。

"標準的な動作では大文字と小文字が区別されませんが、"とありましたので、
開発環境でのみ設定するのは控えようと思いました。

あるいは、プログラムのインストーラーに、この設定自体をいじるよう仕込むことなどは、
物理的に、及び現実的に可能なのでしょうか?

重ねての質問になり申し訳ありません。

引用返信 編集キー/
■100790 / inTopicNo.8)  Re[4]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ ゆうたろう (5回)-(2022/10/27(Thu) 09:18:34)
No100774 (魔界の仮面弁士 さん) に返信

とても細かい回答感謝します。
元々のコードが実にエレファントでチンプンカンプンだったので、
お陰様で理解が進みました。

CreateDirectory APIも試してみます。

当面は入力→反映のタイミングで、すべて小文字に統一させ、
アラートでユーザーに通知する仕様にしたいと思います。


引用返信 編集キー/
■100795 / inTopicNo.9)  Re[5]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ KOZ (339回)-(2022/10/27(Thu) 13:10:34)
No100789 (ゆうたろう さん) に返信
>>Windows 10、ビルド 17107 から区別できるよう設定が可能らしいです。
>>試してみて報告していただけるとありがたいです。
> "標準的な動作では大文字と小文字が区別されませんが、"とありましたので、
> 開発環境でのみ設定するのは控えようと思いました。

これって WSL 上で動くアプリからの話のようで、標準の Windows アプリには適用されないみたいです。
失礼しました。
引用返信 編集キー/
■100796 / inTopicNo.10)  Re[6]: VB.NET ファイル出力時の大文字小文字の区別について
□投稿者/ ゆうたろう (6回)-(2022/10/27(Thu) 15:44:48)
No100795 (KOZ さん) に返信

そうでしたか、
わざわざお調べいただきありがとうございます。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ