入力ファイル名に基づいてディレクトリを作成するクロスプラットフォーム互換の関数をC++で作成しています。マシンがLinuxなのかWindowsなのかを知り、適切なスラッシュまたはバックスラッシュを使用する必要があります。以下の次のコードでは、マシンがLinuxの場合、isLinux = true
。 OSを確認するにはどうすればよいですか?
bool isLinux;
std::string slash;
std::string directoryName;
if isLinux
slash = "/";
else
slash = "\\";
end
boost::filesystem::create_directory (full_path.native_directory_string() + slash + directoryName);
使用する:
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
static const std::string slash="\\";
#else
static const std::string slash="/";
#endif
ところで、Windowsはこれを完全に理解しているので、Windowsでこのスラッシュ「/」を安全に使用できます。したがって、「/」スラッシュを使用するだけで、パスがfoo:[bar.bee]test.ext
であるOpenVMSのようにすべてのOSの問題が解決されます。これは/foo/bar/bee/test.ext
として表すことができます。
一般的に言えば、条件付きコンパイルでこれを行う必要があります。
とはいえ、boost::filesystem
を使用している場合は、このようなことを忘れることができるように、 ポータブル汎用パス形式 を使用する必要があります。
デフォルトでは、Visual Studio #define
s _WIN32
プリプロセッサプロジェクトの設定。
だからあなたは使うことができます
// _WIN32 = we're in windows
#ifdef _WIN32
// Windows
#else
// Not windows
#endif
調べてください http://en.wikipedia.org/wiki/Uname
コンパイラ/ GNUとしてg ++を使用している場合は、以下のコードを試すことができます。 POSIX準拠の環境はこれをサポートします:
#include <stdio.h>
#include <sys/utsname.h>
#include <stdlib.h>
int main()
{
struct utsname sysinfo;
if(uname(&sysinfo)) exit(9);
printf("os name: %s\n", sysinfo.sysname);
return 0;
}
これを行うために最もよく使用される方法の1つは、 プリプロセッサディレクティブ を使用することです。リンクはC用ですが、C++でも同じように使用されます。公正な警告です。各コンパイラとOSは、独自のディレクティブのセットを持つことができます。
predef.sourceforge.net は、コンパイラ/オペレーティングシステムなどを識別するすべての種類のMACROの包括的なコレクションです。 (オペレーティングシステムのサブサイトに直接リンクしています)