FS создать папку, если она не существует, как это сделать [дублировать]

наилучшим способом является

function password_validate(txt) {
  var val1 = 0;
  var val2 = 0;
  var val3 = 0;
  var val4 = 0;
  var val5 = 0;
  var counter, color, result;
  var flag = false;
  if (txt.value.length <= 0) {
    counter = 0;
    color = "transparent";
    result = "";
  }
  if (txt.value.length < 8 & txt.value.length > 0) {
    counter = 20;
    color = "red";
    result = "Short";
  } else {
    document.getElementById(txt.id + "error").innerHTML = " ";
    txt.style.borderColor = "grey";
    var regex = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).{8,15}$/;
    //  document.getElementById("pass_veri").style.display="block";
    var fletter = /[a-z]/;
    if (fletter.test(txt.value)) {
      val1 = 20;

    } else {
      val1 = 0;
    }
    //macth special character
    var special_char = /[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/;
    if (special_char.test(txt.value)) {
      val2 = 30;
    } else {
      val = 0;
    }
    /*capital_letter*/
    var cap_lett = /[A-Z]/;
    if (cap_lett.test(txt.value)) {
      val3 = 20;
    } else {
      val = 0;
    }
    /*one numeric*/
    var num = /[0-9]/;
    if (num.test(txt.value)) {
      val4 = 20;
    } else {
      val4 = 0;
    }
    /* 8-15 character*/
    var range = /^.{8,50}$/;
    if (range.test(txt.value)) {
      val5 = 10;
    } else {
      val5 = 0;
    }
    counter = val1 + val2 + val3 + val4 + val5;

    if (counter >= 30) {
      color = "skyblue";
      result = "Fair";
    }
    if (counter >= 50) {
      color = "gold";
      result = "Good";
    }
    if (counter >= 80) {
      color = "green";
      result = "Strong";
    }
    if (counter >= 90) {
      color = "green";
      result = "Very Strong";
    }
  }
  document.getElementById("prog").style.width = counter + "%";
  document.getElementById("prog").style.backgroundColor = color;
  document.getElementById("result").innerHTML = result;
  document.getElementById("result").style.color = color;
}
body {
  font-family: 'Rajdhani', sans-serif;
  background-color: #E4E4E4;
}


/* tooltip*/

.hint {
  width: 258px;
  background: red;
  position: relative;
  -moz-border-radius: 10px;
  -webkit-border-radius: 10px;
  border-radius: 10px;
  position: absolute;
  left: 0px;
  border: 1px solid #CC9933;
  background-color: #FFFFCC;
  display: none;
  padding: 20px;
  font-size: 11px;
}

.hint:before {
  content: "";
  position: absolute;
  left: 100%;
  top: 24px;
  width: 0;
  height: 0;
  border-top: 17px solid transparent;
  border-bottom: 1px solid transparent;
  border-left: 22px solid #CC9933;
}

.hint:after {
  content: "";
  position: absolute;
  left: 100%;
  top: 26px;
  width: 0;
  height: 0;
  border-top: 14px solid transparent;
  border-bottom: 1px solid transparent;
  border-left: 20px solid #FFFFCC;
}

.parent {
  position: relative;
}

.progress {
  height: 7px;
}

#progres {
  display: block;
}

p {
  margin: 0px;
  font-weight: normal;
}

.form-control {
  width: none;
  margin-left: 260px;
  margin-top: 25px;
  width: 200px;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<div class="form-group col-lg-12 parent ">
  <label class="hint" id="pass-hint">
    Password Strength:<span id="result"></span>
    <br>
    <div class="progress" id="progres">
      <div class="progress-bar progress-bar-danger" role="progressbar" id="prog">
      </div>
    </div>
    <p> passowrd must have atleast 8 charatcer</p>
  </label>
  <input type="password" class="form-control" data-toggle="tooltip" data-placement="left" id="pass" onfocus="document.getElementById('pass-hint').style.display='block'" onblur="document.getElementById('pass-hint').style.display='none'" placeholder="**********"
    oninput="password_validate(this);document.getElementById('progres').style.display='block';">
  <i class=" form-control-feedback" id="passsuccess" aria-hidden="true"></i>
  <span id="passerror" class="help-block error"></span>
</div>

70
задан David Silva Smith 27 July 2015 в 05:49
поделиться

12 ответов

Один из вариантов заключается в использовании shelljs module

npm install shelljs

var shell = require('shelljs');
shell.mkdir('-p', fullPath);

С этой страницы:

Доступные опции:

p: полный путь (при необходимости создадут промежуточные каталоги)

Как отмечали другие, есть и другие более целенаправленные модули. Но, вне mkdirp, он имеет множество других полезных операций с оболочкой (например, grep и т. Д.), И он работает на windows и * nix

28
ответ дан bryanmac 16 August 2018 в 10:01
поделиться
  • 1
    Благодаря! Я закончил использовать exec (я уже использовал это), и это сработало как шарм. var exec = require ('child_process'). exec; var command = & quot; mkdir -p '& quot; + newDest + & quot; '& quot ;; var options = {}; var after = function (error, stdout, stderr) {console.log ('error', error); console.log ('stdout', stdout); console.log ('stderr', stderr); } exec (команда, параметры, после); – David Silva Smith 27 July 2015 в 13:29
  • 2
    Удивительно - рад, что это сработало :) – bryanmac 28 July 2015 в 03:03
  • 3
    Этот параметр может ломаться на платформах node.js, у которых нет экземпляра mkdir командной строки (т. Е. Не-Linux-y хостов), поэтому он не переносится, если это имеет значение. – cshotton 3 February 2016 в 16:15
  • 4
    @cshotton - вы имеете в виду комментарий или ответ? shelljs работает даже на окнах. exec mkdir -p (комментарий), конечно же, нет. – bryanmac 25 April 2017 в 12:19

, используя модуль mkdir-p, является хорошим вариантом, как некоторые из ответов. Но вместо этого я использовал js-функцию для своего приложения. Он работает для меня в среде Windows; не тестировались в mac / linux. Если вы уже используете jquery, тогда это будет удобно, я думаю. Или вы можете использовать эту логику с чистым javascript тоже.

        var arrPath=loc.split(path.sep);
        var tmpPath="";
        $.each(arrPath,(index,value)=>{             
            if(index==0 && value==""){
                /*in mac path starts with path seperator 'forward slash'
                then after the split 0th element will be empty string*/
                tmpPath=path.sep;
            }
            else{
                if(index==0){
                    tmpPath=value;
                }
                else{       
                    tmpPath=path.join(tmpPath,value);
                }

                if (!fs.existsSync(tmpPath)) { /* if the directory not exists*/
                   fs.mkdirSync(tmpPath);
                }
            }
        });

        if(fs.existsSync(tmpPath))
            return true;
        else
            return false
-4
ответ дан Arvin 16 August 2018 в 10:01
поделиться
  • 1
    Все, что вам нужно, это jQuery, в NodeJS? И полная библиотека, просто чтобы перебрать массив, помимо всего прочего? I действительно не так думаю :) Downvoted – Jeremy Thille 21 December 2017 в 13:50
  • 2
    Я использую jquery для загрузки моего webapp в node-webkit. Я не использую node.js напрямую. Поэтому я считаю, что это правильный ответ, если нужный человек использует jquery / javascript в своем проекте. Отредактировал мой ответ. :) @JeremyThille – Arvin 8 January 2018 в 17:27
  • 3
    Но не является ли узел-webkit клиентской библиотекой / материалом? NodeJS - это серверная технология, вопрос заключается в создании папок на сервере. – Jeremy Thille 8 January 2018 в 17:32

Слишком много ответов, но вот решение без рекурсии, которое работает путем разделения пути, а затем слева направо, снова создает его обратно

function mkdirRecursiveSync(path) {
    let paths = path.split(path.delimiter);
    let fullPath = '';
    paths.forEach((path) => {

        if (fullPath === '') {
            fullPath = path;
        } else {
            fullPath = fullPath + '/' + path;
        }

        if (!fs.existsSync(fullPath)) {
            fs.mkdirSync(fullPath);
        }
    });
};

. Для тех, кто обеспокоен совместимостью Windows vs Linux, просто замените косую черту двойным обратным слэшем «\» в обоих случаях выше, но TBH мы говорим о командной строке node fs not windows, а первая довольно прощаем, а приведенный выше код будет просто работать на Windows и является более полным решением для кросс-платформы .

1
ответ дан Azarus 16 August 2018 в 10:01
поделиться
  • 1
    файлы в окнах обрабатываются с обратной косой чертой без косой черты. Ваш код просто не будет работать. C: \ data \ test ... – Azarus 7 June 2018 в 16:04
  • 2
    Отредактировано, но предлагаю вам подтвердить свой комментарий. На узле попробуйте следующее и посмотрите, что происходит var fs = require ('fs') fs.mkdirSync ('test') fs.mkdirSync ('test \\ test1') fs.mkdirSync ('test / test2') – Hamiora 8 June 2018 в 21:16
  • 3
    Что бы вы ни говорили ... мое голосование по-прежнему остается, пока вы не научитесь писать лучший код. – Azarus 10 June 2018 в 13:56
  • 4
    Ха-ха. Хорошо, я буду работать очень тяжело научиться лучше писать код. BTW большинство ответов выше, включая OP, используют косые черты. Предложите прекратить троллинг. – Hamiora 11 June 2018 в 21:29
  • 5
    Просто поставить path.delimiter вместо косой черты вместо того, чтобы спорить? Или обрабатывайте оба кода, чтобы вы могли получить поддержку. – Azarus 13 June 2018 в 07:01

Более надежный ответ заключается в использовании mkdirp .

var mkdirp = require('mkdirp');

mkdirp('/path/to/dir', function (err) {
    if (err) console.error(err)
    else console.log('dir created')
});

Затем перейдите к записи файла в полный путь с помощью:

fs.writeFile ('/path/to/dir/file.dat'....
57
ответ дан Frosty Z 16 August 2018 в 10:01
поделиться
  • 1
    Предпочитайте этот ответ, поскольку вы импортируете только то, что вам нужно, а не всю библиотеку – Juan Mendes 26 August 2016 в 14:30
  • 2
    Поздравляю с популистским значком ;-) – janos 30 June 2017 в 13:28
  • 3
    Благодарю. Это самый лучший метод. – Stepan Rafael 26 May 2018 в 15:32

Как насчет этого подхода:

if (!fs.existsSync(pathToFile)) {
            var dirName = "";
            var filePathSplit = pathToFile.split('/');
            for (var index = 0; index < filePathSplit.length; index++) {
                dirName += filePathSplit[index]+'/';
                if (!fs.existsSync(dirName))
                    fs.mkdirSync(dirName);
            }
        }

Это работает для относительного пути.

1
ответ дан Gouravmoy Mohanty 16 August 2018 в 10:01
поделиться

Exec может быть запутанным для окон. Существует более «нудистское» решение. По сути, у вас есть рекурсивный вызов, чтобы увидеть, существует ли каталог и погрузиться в дочерний элемент (если он существует) или создать его. Вот функция, которая будет создавать дочерние элементы и вызывать функцию по окончании:

fs = require('fs');
makedirs = function(path, func) {
 var pth = path.replace(/['\\]+/g, '/');
 var els = pth.split('/');
 var all = "";
 (function insertOne() {
   var el = els.splice(0, 1)[0];
   if (!fs.existsSync(all + el)) {
    fs.mkdirSync(all + el);
   }
   all += el + "/";
   if (els.length == 0) {
    func();
   } else {
     insertOne();
   }
   })();

}

0
ответ дан Greg S 16 August 2018 в 10:01
поделиться

Используя сокращение, мы можем проверить, существует ли каждый путь и создать его, если это необходимо, и таким образом, я думаю, что легче следовать. Отредактировано, спасибо @Arvin, мы должны использовать path.sep, чтобы получить подходящий разделитель сегментов пути для конкретной платформы.

const path = require('path');

// Path separators could change depending on the platform
const pathToCreate = 'path/to/dir'; 
pathToCreate
 .split(path.sep)
 .reduce((currentPath, folder) => {
   currentPath += folder + path.sep;
   if (!fs.existsSync(currentPath)){
     fs.mkdirSync(currentPath);
   }
   return currentPath;
 }, '');
16
ответ дан josebui 16 August 2018 в 10:01
поделиться

fs-extra добавляет методы файловой системы, которые не включены в собственный модуль fs.

Установить fs-extra

$ npm install --save fs-extra

var fs = require("fs-extra");
// Make sure the output directory is there.
fs.ensureDirSync(newDest);

Есть параметры синхронизации и асинхронизации.

]

https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md

104
ответ дан Mouneer 16 August 2018 в 10:01
поделиться
  • 1
    Это лучший ответ! В любом случае у большинства из нас уже есть fs-extra. – pagep 19 March 2017 в 15:06
  • 2
    Upvote для легкого, рекурсивного ответа, не требующего дополнительной библиотеки или подхода! – MikingTheViking 19 April 2017 в 21:20
  • 3
    Спасибо @John за это. Теперь он исправлен :) – Mouneer 31 May 2017 в 01:19
  • 4
    Отсутствуют требуемые утверждения: const fs = require ('fs'); const path = require ('path'); – Christopher Bull 6 July 2017 в 20:07
  • 5
    @ChristopherBull, намеренно не добавил просто сосредоточиться на логике, но в любом случае я добавил их. Благодаря ;) – Mouneer 7 July 2017 в 12:05
  • 6
    12 строк сплошного кода, нулевые зависимости, я буду принимать его каждый раз. – moodboom 8 July 2017 в 18:35

Асинхронный способ рекурсивно создавать каталоги:

import fs from 'fs'

const mkdirRecursive = function(path, callback) {
  let controlledPaths = []
  let paths = path.split(
    '/' // Put each path in an array
  ).filter(
    p => p != '.' // Skip root path indicator (.)
  ).reduce((memo, item) => {
    // Previous item prepended to each item so we preserve realpaths
    const prevItem = memo.length > 0 ? memo.join('/').replace(/\.\//g, '')+'/' : ''
    controlledPaths.push('./'+prevItem+item)
    return [...memo, './'+prevItem+item]
  }, []).map(dir => {
    fs.mkdir(dir, err => {
      if (err && err.code != 'EEXIST') throw err
      // Delete created directory (or skipped) from controlledPath
      controlledPaths.splice(controlledPaths.indexOf(dir), 1)
      if (controlledPaths.length === 0) {
        return callback()
      }
    })
  })
}

// Usage
mkdirRecursive('./photos/recent', () => {
  console.log('Directories created succesfully!')
})
1
ответ дан muratgozel 16 August 2018 в 10:01
поделиться

На основе ответа на нуль-зависимости mouneer's , вот немного более удобный для начинающих Typescript вариант, в качестве модуля:

import * as fs from 'fs';
import * as path from 'path';

/**
* Recursively creates directories until `targetDir` is valid.
* @param targetDir target directory path to be created recursively.
* @param isRelative is the provided `targetDir` a relative path?
*/
export function mkdirRecursiveSync(targetDir: string, isRelative = false) {
    const sep = path.sep;
    const initDir = path.isAbsolute(targetDir) ? sep : '';
    const baseDir = isRelative ? __dirname : '.';

    targetDir.split(sep).reduce((prevDirPath, dirToCreate) => {
        const curDirPathToCreate = path.resolve(baseDir, prevDirPath, dirToCreate);
        try {
            fs.mkdirSync(curDirPathToCreate);
        } catch (err) {
            if (err.code !== 'EEXIST') {
                throw err;
            }
            // caught EEXIST error if curDirPathToCreate already existed (not a problem for us).
        }

        return curDirPathToCreate; // becomes prevDirPath on next call to reduce
    }, initDir);
}
0
ответ дан Paul-Sebastian Manole 16 August 2018 в 10:01
поделиться

Эта версия работает лучше в Windows, чем верхний ответ, потому что она понимает как /, так и path.sep, так что передние косые черты работают на Windows по своему усмотрению. Поддерживает абсолютные и относительные пути (относительно process.cwd).

/**
 * Creates a folder and if necessary, parent folders also. Returns true
 * if any folders were created. Understands both '/' and path.sep as 
 * path separators. Doesn't try to create folders that already exist,
 * which could cause a permissions error. Gracefully handles the race 
 * condition if two processes are creating a folder. Throws on error.
 * @param targetDir Name of folder to create
 */
export function mkdirSyncRecursive(targetDir) {
  if (!fs.existsSync(targetDir)) {
    for (var i = targetDir.length-2; i >= 0; i--) {
      if (targetDir.charAt(i) == '/' || targetDir.charAt(i) == path.sep) {
        mkdirSyncRecursive(targetDir.slice(0, i));
        break;
      }
    }
    try {
      fs.mkdirSync(targetDir);
      return true;
    } catch (err) {
      if (err.code !== 'EEXIST') throw err;
    }
  }
  return false;
}
0
ответ дан Qwertie 16 August 2018 в 10:01
поделиться

Вот моя императивная версия mkdirp для nodejs.

function mkdirSyncP(location) {
    let normalizedPath = path.normalize(location);
    let parsedPathObj = path.parse(normalizedPath);
    let curDir = parsedPathObj.root;
    let folders = parsedPathObj.dir.split(path.sep);
    folders.push(parsedPathObj.base);
    for(let part of folders) {
        curDir = path.join(curDir, part);
        if (!fs.existsSync(curDir)) {
            fs.mkdirSync(curDir);
        }
    }
}
0
ответ дан ubershmekel 16 August 2018 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: