私は、ファイルをダウンロードし、それに送信されたパラメータに基づいてネストされたディレクトリ構造に保存する関数を持っています(例:./somedir/a/b/c or ./ somedir2/a/d/b)。途中のディレクトリが作成されているとは信じられないので、存在しない場合は、ファイルパスに沿って各ディレクトリをチェックして作成する必要があります。さて、ノード0.4.xでは完璧に動作するいくつかのコードがありますが、ノード0.5.x(少なくとも0.5.10でテスト済み)のWindowsバージョンでは何かが壊れています。Node.jsの再帰的ディレクトリの作成0.5.x
私はファイルシステムを理解するのがひどいので、誰かがこの作業をどのように行うか、それと同様に動作する他のものと置き換えることができたら、私は非常に感謝しています。目標は、ノード0.4.xと0.5.xだけでなく、UnixとWindowsの両方で適切に機能するコードを持つことです。
// automatically create directories if they do not exist at a path
function mkdirs(_path, mode, callback) {
var dirs = _path.split("/");
var walker = [dirs.shift()];
var walk = function (ds, acc, m, cb) {
if (ds.length > 0) {
var d = ds.shift();
acc.push(d);
var dir = acc.join("/");
fs.stat(dir, function (err, stat) {
if (err) {
// file does not exist
if (err.errno == 2) {
fs.mkdir(dir, m, function (erro) {
if (erro && erro.errno != 17) {
terminal.error(erro, "Failed to make " + dir);
return cb(new Error("Failed to make " + dir + "\n" + erro));
} else {
return walk(ds, acc, m, cb);
}
});
} else {
return cb(err);
}
} else {
if (stat.isDirectory()) {
return walk(ds, acc, m, cb);
} else {
return cb(new Error("Failed to mkdir " + dir + ": File exists\n"));
}
}
});
} else {
return cb();
}
};
return walk(dirs, walker, mode, callback);
};
使用例:
mkdirs('/path/to/file/directory/', 0777, function(err){
EDIT:それは私自身の質問に答えるという愚かな感じが、私はように見える
#
# Function mkdirs
# Ensures all directories in a path exist by creating those that don't
# @params
# path: string of the path to create (directories only, no files!)
# mode: the integer permission level
# callback: the callback to be used when complete
# @callback
# an error object or false
#
mkdirs = (path, mode, callback) ->
tryDirectory = (dir, cb) ->
fs.stat dir, (err, stat) ->
if err #the file doesn't exist, try one stage earlier then create
if err.errno is 2 or err.errno is 32 or err.errno is 34
if dir.lastIndexOf("/") is dir.indexOf("/") #only slash remaining is initial slash
#should only be triggered when path is '/' in Unix, or 'C:/' in Windows
cb new Error("notfound")
else
tryDirectory dir.substr(0, dir.lastIndexOf("/")), (err) ->
if err #error, return
cb err
else #make this directory
fs.mkdir dir, mode, (error) ->
if error and error.errno isnt 17
cb new Error("failed")
else
cb()
else #unkown error
cb err
else
if stat.isDirectory() #directory exists, no need to check previous directories
cb()
else #file exists at location, cannot make folder
cb new Error("exists")
path = (if path.indexOf("\\") >= 0 then path.replace("\\", "/") else path) #change windows slashes to unix
path = path.substr(0, path.length - 1) if path.substr(path.length - 1) is "/" #remove trailing slash
tryDirectory path, callback
私は、OSがWindows 'VARウィンドウ= _path.indexOf( '\\')であれば決定異なる分岐ロジックを使用して試してみました> = 0; '、しかし私はまだENOENTエラーを取得しています。私が知ることから、fs.statはerrno 32でエラーを返しています。これによりコードが失敗します。 – geoffreak
もう少し調べてみると、fs.statについて何か不安なので、[githubに関する問題](https://github.com/joyent/node/issues/1927)を投稿しました。 – geoffreak