9

これをグーグルで試してみましたが、さまざまな特定の状況に基づいた回答が非常に多いため、率直に言って、始めたときよりも行き詰まっています。

事実は次のとおりです。

  • 言語: C/C++
  • OS: Windows
  • IDE:ビジュアル スタジオ 2005
  • CreateDirectory (windows.h の #include の後) を使用して、プログラムの関数からディレクトリを作成しようとしています。
  • おそらく、最初のパラメーター (パス) は char* でなければなりません。ただし、コンパイルしようとすると、エラー C2664: 'CreateDirectoryW' : パラメーター 1 を 'char *' から 'LPCWSTR' に変換できません。
  • 私が読んだことは、UNICODE と ANSI の間に何らかの問題があるということです。解決策は大きく異なり、重要なものを壊したり、非常に愚かなことをしたりすることを恐れています。
  • 他のライブラリを見つけなくてもディレクトリが存在する場合は、新しいディレクトリを作成する他の方法を使用しても構いません。
  • 私は comp sci のマイナーな知識しかありませんでした。率直に言って、stdio を介してファイルを開いたり、閉じたり、編集したり、その他の方法でファイルにアクセスしたりするのがとても簡単な理由はわかりませんが、ディレクトリで何かを行う (具体的にはそれらを作成し、それらが存在するかどうかを調べる) ことはワイルドですインターネットの街中をガチョウが追いかけ回します。

CreateDirectory での現在の試行を修正するか、別のものを使用してディレクトリを作成するために、私を助けてください。

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

4

3 に答える 3

12

これは完全にクレイジーです。Windows 95/8/Me は ANSI オペレーティング システムであり、NT/XP/Vista などは UNICODE オペレーティング システムであるため、Microsoft は ANSI (彼らが呼ぶように) と UNICODE の両方を同じコードからサポートするメカニズムを持っています。したがって、本当に必要な場合は、両方のシステムをサポートする 1 つのコード セットを記述し、各システム用に再コンパイルするだけです。

しかし、もはや Windows 95/98/Me に興味を持っている人はいますか? それでも、このようなことは初心者を混乱させ続けます。

Windows には CreateDirectory という関数はなく、CreateDirectoryW という UNICODE 関数と CreateDirectoryA という ANSI 関数があります。マクロCreateDirectory は、定義したコンパイラ オプションに応じて、CreateDirectoryW または CreateDirectoryA に変換されます。CreateDirectoryW を使用することになった場合 (明らかに行ったように)、それに Unicode 文字列を渡す必要があります。CreateDirectoryA を使用する場合は、通常の ASCII 文字列を渡します。

あなたのケースで最も簡単なことは、これらすべてを忘れて、CreateDirectoryA を直接呼び出すことです。

CreateDirectoryA("c:\\some\\directory", NULL);

C++ でディレクトリを作成するのが難しいのはなぜですか? C が新しかった 70 年代には、すべてのオペレーティング システムにディレクトリがあったわけではなかったため、このようなものが言語標準に組み込まれることはなかったと思います。

于 2011-08-10T19:12:51.210 に答える
2

VS2005 はデフォルトで Unicode であり、そのままにしておくことをお勧めします。将来的に多くの問題を解決できる可能性があります。Unicode ビルドCreateDirectory(およびその他の Win32 関数)wchar_tでは、通常の ではなく、文字列が想定されますchar。文字列リテラルを作成wchar_tするのは簡単です -

L"Some string"常に Unicode に_T("Some string")するか、構成に依存するようにします。

をどのように呼び出しているのか正確にはわかりませんがCreateDirectory、文字列を Unicode に変換するのが面倒な場合は、ANSI バージョンを直接使用できます - CreateDirectoryA. より詳細な回答が必要な場合は、コードを投稿してください。

于 2011-08-10T19:04:48.247 に答える
1

#undef UNICODEを含める前に使用してみてくださいwindows.h。あなた実際に Unicode をコーディングしている場合を除きますが、それは別の話です。

新しい Visual Studioでは、windows.hデフォルトで Unicode バージョンになっているため#undef UNICODE、ANSI バージョンが返されます。スタック トレースに表示されCreateDirectoryAますCreateDirectoryW

または、直接電話するだけCreateDirectoryAですが、どういうわけかそれはベストプラクティスではないと感じています.

于 2011-08-10T18:59:49.543 に答える