Ответ 1
Существование переменной "outputStream" предполагает, что на данный момент, возможно, вы уже открыли файл для записи, и в этом процессе вы усекали его. Попробуйте вычислить размер до фактического открытия файла?
Я делаю апплет для передачи файлов 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
Спасибо
Существование переменной "outputStream" предполагает, что на данный момент, возможно, вы уже открыли файл для записи, и в этом процессе вы усекали его. Попробуйте вычислить размер до фактического открытия файла?
Длина в байтах файла, обозначенного этим абстрактным именем пути, или 0L
, если файл не существует. Некоторые операционные системы могут возвращать 0L
для имен путей, обозначающих системные объекты, такие как устройства или каналы.
В этом коде нет причин, чтобы я мог понять, почему он должен возвращать 0, если он не пуст, делаете ли вы что-нибудь в другом месте с этим файлом?
Если вы открыли файл где-то в другом месте или записываете его, а длина звонка - до того, как вы сбросили запись (это может быть на Java или в другом месте), тогда оно может вернуться 0. Если вы закроете и очистите все писателей в этот файл, прежде чем проверять его длину, и у вас может быть другой результат.
Вероятно, у вас недостаточно прав для доступа к файлу...
При разработке вы можете изменить политику безопасности Java, чтобы разрешить доступ к локальным файлам: см. %JRE_HOME%/lib/security/java.policy
, попробуйте добавить
permission java.io.FilePermission "<<ALL FILES>>", "read,write";
Попробуйте использовать новый JNLP API для доступа к локальным файлам (только Java5 хотя...)
Вы используете shoud:
Файл файла = новый файл (uri.getPath());
вместо
Файл файла = новый файл (uri.toString());
Иногда возникают проблемы с ОС при точном возврате размера файла, даже если файл достаточно стабилен. Я применил двукратный подход к использованию 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;
}