Java.io.File.length() возвращает 0

Я делаю апплет для передачи файлов ftp, и мне нужно знать размер локального файла (для возобновления загрузки). Проблема заключается в том, что File.length() возвращает 0.

Файл существует (отмечен с помощью File.exists()) и имеет более 0 байтов (по крайней мере, в Windows).

Я не знаю, где больше искать, почему length() возвращает 0.

Вот часть кода и результат.

long fileOffset = 0;

if(localfile.exists()){
    fileOffset = localfile.length();
    System.out.println("The file " + localfile.getAbsolutePath() + " has " + localfile.length() +" in size");
    System.out.println("Resume at: " + fileOffset);
    outputStream.skip(fileOffset);
    ftp.setRestartOffset(fileOffset);
    count = fileOffset;
}

И результат в консоли:

The file D:\test\About Downloads.pdf has 0 in size
Resume at: 0

Спасибо

Ответ 1

Существование переменной "outputStream" предполагает, что на данный момент, возможно, вы уже открыли файл для записи, и в этом процессе вы усекали его. Попробуйте вычислить размер до фактического открытия файла?

Ответ 2

Длина в байтах файла, обозначенного этим абстрактным именем пути, или 0L, если файл не существует. Некоторые операционные системы могут возвращать 0L для имен путей, обозначающих системные объекты, такие как устройства или каналы.

Ответ 3

В этом коде нет причин, чтобы я мог понять, почему он должен возвращать 0, если он не пуст, делаете ли вы что-нибудь в другом месте с этим файлом?

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

Ответ 4

Вероятно, у вас недостаточно прав для доступа к файлу...

  • Попробуйте подписать свой апплет. (Даже самозаверяющий сертификат будет делать.)
  • При разработке вы можете изменить политику безопасности Java, чтобы разрешить доступ к локальным файлам: см. %JRE_HOME%/lib/security/java.policy, попробуйте добавить

    permission java.io.FilePermission "<<ALL FILES>>", "read,write";

  • Попробуйте использовать новый JNLP API для доступа к локальным файлам (только Java5 хотя...)

Ответ 5

Вы используете shoud:

Файл файла = новый файл (uri.getPath());

вместо

Файл файла = новый файл (uri.toString());

Ответ 6

Иногда возникают проблемы с ОС при точном возврате размера файла, даже если файл достаточно стабилен. Я применил двукратный подход к использованию File и NIO, если File не удалось

     long discoveredFileLength = discoveredFile.length();
    if (discoveredFileLength == 0) {
        final Path discoveredFilePath = Paths.get(discoveredFile.getAbsolutePath());
        FileChannel discoveredFileChannel = null;
        try {
            discoveredFileChannel = FileChannel.open(discoveredFilePath);
            discoveredFileLength = discoveredFileChannel.size();
        }
        catch (IOException e2) {
        }
    }

    if (discoveredFileLength <= 0) {
        logErrors(discoveredFile.getName() + " " + discoveredFileLength  + " COULD NOT BE PROCESSED (length <= 0)");
        _reporter.increaseFilesFailed();
        return;
    }