Как проверить, что файл доступен для записи (ресурс не занят и не заблокирован) - PullRequest
0 голосов
/ 01 января 2019

excel4node * функция записи в файл перехватывает ошибку и не передает вызывающей стороне.Поэтому мое приложение не может определить, была ли запись в файл успешной или нет.

Мой текущий обходной путь выглядит следующим образом:

let fs = require('fs')
try {
  let filePath = 'blahblah'
  fs.writeFileSync(filePath, '') // Try-catch is for this statement
  excel4nodeWorkbook.write(filePath)
} catch (e) {
  console.log('File save is not successful')
}

Это работает, но я думаю, что это своего рода хак, и этоэто не семантически правильный способ.Я также протестировал fs.access и fs.accessSync, но они проверяют только разрешение, а не состояние (занято / заблокировано) ресурса.

Есть ли какие-либо предложения, чтобы это выглядело и вело себя лучше без изменения исходного кода excel4node

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Вы уже отметили строку в исходном коде библиотеки.Если вы посмотрите на несколько строк выше, вы увидите, что он использует аргумент handler для передачи любых ошибок.Фактически, посмотрев на комментарий к документации над функцией, он говорит:

Если задан обратный вызов, обратный вызов, вызванный с (err, fs.Stats), прошел

СледовательноВы можете просто передать функцию в качестве второго аргумента и проверить err, как вы, вероятно, уже видели в других местах в среде узла:

excel4nodeWorkbook.write(filepath, (err) => {
    if (err) {
        console.error(err);
    }
});
0 голосов
/ 01 января 2019

Я думаю, что вы задаете неправильный вопрос.Если вы проверите в момент времени T, а затем напишите в момент времени T + 1 мс, что будет гарантировать, что файл все еще доступен для записи?

Если файл недоступен для записи по какой-либо причине , запись будетпровал, точка.Нечего делать.Ваш код в порядке, но вы, вероятно, также можете обойтись без fs.writeFileSync(), который просто сотрет все, что было в файле ранее.

Вы также можете записать в случайно сгенерированный путь к файлу, чтобы удостовериться в достаточной уверенностичто два процесса не пишут в один и тот же файл одновременно, но опять-таки, это не предотвратит все возможные ошибки записи, так что вы действительно хотите действительно хорошую обработку ошибок.

Чтобы правильно обрабатывать ошибки, вы должны предоставить обратный вызов !

Что-то вроде:

excel4nodeWorkbook.write(filePath, (err) => {
  if (err) console.error(err);
});

Осторожно, этоасинхронный код, так что вам нужно справиться и с этим!

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