Размер входного файла и содержимое не обновляются в macOS - PullRequest
0 голосов
/ 16 мая 2018

Я написал небольшой веб-инструмент, который использует ввод файла для чтения постоянно меняющегося файла. Пользователь выбирает его вручную (один раз!) И отслеживает JavaScript, когда он был изменен (время последнего изменения файла и размер файла). Если он изменился, он снова считывает содержимое файла.

Это прекрасно работает во всех браузерах Windows. Но в macOS (протестировано в Safari 10.1.2 и Firefox 51.0.1) обновляется только время последней модификации. Размер файла не обновляется, и кажется, что содержимое файла больше не может быть прочитано. Поэтому я не могу отслеживать изменения файлов в браузерах на macOS.

Но почему? Это ограничение безопасности в macOS?

Пожалуйста, проверьте следующий фрагмент. Выберите файл (например, текстовый файл), посмотрите последнюю измененную временную метку и размер файла, затем измените файл и посмотрите снова, изменился ли размер. В macOS размер файла не меняется.

Нет, пожалуйста, jQuery.

window.addEventListener('load', function() {
  window.setInterval(function() {
    var logFile = document.querySelector('#file').files[0];
    if (logFile) {
      document.querySelector('#info').innerHTML = '<br/>' +
        (new Date()).toString() + '<br/>Last modified: ' +
        logFile.lastModified +
        '<br/>Size: ' +
        logFile.size;
    }
  }, 1000);
});
#info {
  font-family: Courier;
  font-size: 0.9em;
}
<!DOCTYPE html>
<input type="file" id="file" />
<p id="info"></p>

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я помню, у меня была проблема с чтением ввода файла снова и снова. очевидно, он пометил файл как измененный, и у меня возникла проблема с использованием FileReader для файла после его изменения. но есть способ обойти


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

по какой-то причине он не работал в SO из-за ограничения песочницы , поэтому я создал jsfiddle также

function traverseFileTree(entery, path) {
  path = path || ""

  if (entery.isFile) {
    // Get file
    entery.file(file => {
        setInterval(() => {
          entery.file(file => {
            console.log(file.lastModifiedDate, file.size, path)
          })
        }, 1000)
    })
  } else if (entery.isDirectory) {
    // Get folder contents
    var dirReader = entery.createReader()
    dirReader.readEntries(entries => {
      for (let entery of entries) {
        traverseFileTree(entery, path + entery.name + '/')
      }
    }, console.error)
  }
}

var dropzone = document.getElementById('dropzone')

dropzone.addEventListener("drop", function(event) {
  event.preventDefault()

  const items = event.dataTransfer.items

  for (item of items) {
    // webkitGetAsEntry is where the magic happens
    const entery = item.webkitGetAsEntry()

    if (entery) {
      traverseFileTree(entery)
    }
  }
}, false)

// Required for drop event to event do what we want
dropzone.ondragover = event => {
  event.preventDefault()
  return false
}
#dropzone{
  background: black;
  height: 30px;
  color: white;
  padding: 10px;
}
<div id="dropzone">
  drop a directory here
</div>
0 голосов
/ 25 мая 2018

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

Обойти это - непростая задача, и я бы пересмотрел потребности в этом,и если обмен сообщениями не может быть выполнен на другом уровне (например, из th-процесса, который изменяет файлы).

Действительно, и Firefox, и Safari не ведут себя одинаково в этой ситуации:

  • Кажется, Safari создает blobURI, указывающий на файл, как только вы выбрали его для ввода, и всегда использует его при попытке доступа к нему позже (например, из FileReader).Настоящая проблема здесь в том, что мы не можем получить новую версию на диске, потому что по каким-то причинам этот blobURI не выглядит как настоящий указатель на диск ... Но если мы толькоЕсли вы хотите обнаружить изменения файла, тогда это хорошо для нас, поскольку нам нужно было бы только проверить наличие события FileReader.onerror, которое будет работать даже с File.slice(0,1) (то есть минимальным вводом / выводом).

  • Firefox, с другой стороны, вызовет ошибку FileReader только , если размер кэшированных метаданных не совпадает с тем, который был прочитан.Это означает, что вам придется читать весь файл при каждой проверке, и, если ошибки не произошло, дважды проверьте, что данные на самом деле совпадают ... Но , в этом браузере вы все равно можете получитьфактический файл на диске из AJAX с использованием blobURI, чтобы получить последнюю версию.

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