Получить размер папки с помощью команды du - PullRequest
1 голос
/ 14 июня 2019

Я использовал размер кода, используя этот код в моем электронном приложении

var util  = require('util'),
spawn = require('child_process').spawn,
size    = spawn('du', ['-sh', '/path/to/dir']);

size.stdout.on('data', function (data) {
console.log('size: ' + data);
});

Это работает на моей машине. когда я беру сборку и запускаю на другом компьютере с Windows, он выдает, что du не распознается как внутренняя команда, подобная этой ...

  1. Почему это работает на моей машине, а не на других машинах Windows
  2. А также я сомневаюсь, что это работает на машинах Linux / Mac ???
  3. как работает эта команда du ??

Или есть какой-либо универсальный способ получить размер каталога на всех трех платформах и на всех машинах.

Ответы [ 4 ]

2 голосов
/ 14 июня 2019

1. В окнах, установленных на вашем компьютере, может быть команда sysinternals du .Его нет во всех установках Windows.Вы можете предпочесть использовать windirstat.info или что-то более родное, например www.getfoldersize.com .

2. С тех пор, как команда UNIX и Linux использовалась для оценки файлового пространства.использование, оно должно работать в любой UNIX, такой как ОС.

3. Команда du - это утилита командной строки, которая сообщает об использовании дискового пространства файловой системы.Его можно использовать для определения использования диска для файлов и папок и для отображения того, что занимает место.Он поддерживает отображение только каталогов или всех файлов, общий итог, вывод в удобочитаемом формате и может быть объединен с другими инструментами UNIX для вывода отсортированного списка самых больших файлов папок в системе.См .: https://shapeshed.com/unix-du/

Если вам нужно, чтобы она работала в ОС UNIX и не-UNIX, вы должны сначала проверить, какая ОС использовалась пользователем вашей программы, а затем выполнить другую команду в зависимости от операции.система, на которой он работает.

1 голос
/ 14 июня 2019

Вы можете использовать команду stat встроенного пакета node.js fs пакета ... но, о, мальчик, это взорвется в памяти, если вы сделаете весь диск.Лучше всего придерживаться проверенных инструментов за пределами узла.

https://repl.it/@CodyGeisler/GetDirectorySizeV2

const { promisify } = require('util');
const watch = fs.watch;
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
const path = require('path');
const { resolve } = require('path');


const getDirectorySize = async function(dir) {
  try{
    const subdirs = (await readdir(dir));
    const files = await Promise.all(subdirs.map(async (subdir) => {
      const res = resolve(dir, subdir);
      const s = (await stat(res));
      return s.isDirectory() ? getDirectorySize(res) : (s.size);
    }));
    return files.reduce((a, f) => a+f, 0);
  }catch(e){
    console.debug('Failed to get file or directory.');
    console.debug(JSON.stringify(e.stack, null, 2));
    return 0;
  }
};

(async function main(){
  try{
    // Be careful if directory is large or size exceeds JavaScript `Number` type
    let size = await getDirectorySize("./testfolder/")
    console.log('size (bytes)',size);
  }catch(e){
    console.log('err',e);
  }
})();
1 голос
/ 14 июня 2019

Очень примитивный и синхронизирующий код. Для продукта необходимо переключиться на асинхронные функции.

const path = require('path');
const fs = require('fs');

function dirsizeSync(dirname) {
    console.log(dirname);
    let size = 0;
    try {
        fs.readdirSync(dirname)
            .map(e => path.join(dirname, e))
            .map(e => {
                try {
                    return {
                        dirname: e,
                        stat: fs.statSync(e)
                    };
                } catch (ex) {
                    return null;
                }
            })
            .forEach(e => {
                if (e) {
                    if (e.stat.isDirectory()) {
                        size += dirsizeSync(e.dirname);
                    } else if (e.stat.isFile()) {
                        size += e.stat.size;
                    }
                }
            });
    } catch (ex) {}
    return size;
}

console.log(dirsizeSync('/tmp') + ' bytes');
1 голос
/ 14 июня 2019

du - это команда Linux. Обычно он недоступен в Windows (нет представления о Mac, извините)

Модуль child_process предоставляет возможность порождать дочерние процессы. Кажется, вы просто выполняете команду в операционной системе. Таким образом, для получения решения, работающего на нескольких системах, у вас может быть два варианта:

  • Проверка операционной системы и выполнение (с порождением) соответствующей системной команды, как вы делаете сейчас. Это делает код максимально простым
  • В качестве альтернативы можно использовать код JavaScript (в StackOverflow есть несколько вопросов о том, как получить размер каталога в файле node.js). Я думаю, что это был бы самый безопасный способ для покрытия любой операционной системы без забот о поддержке команд.

Вы, должно быть, установили некоторые инструменты linux в вашей системе Windows, но вы не можете полагаться на то, что они доступны в любой распространенной Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...