Надежный File.renameTo () альтернатива в Windows?

Мой ответ:

File file = new File(filePath);
        Picasso.with(context).load(file).placeholder(R.drawable.draw_detailed_view_display).error(R.drawable.draw_detailed_view_display)
        .resize(400, 400).into(mImageView, new Callback() {

            @Override
            public void onSuccess() {

            }

            @Override
            public void onError() {
                mImageView.setVisibility(View.GONE);
            }
        });
88
задан Community 23 May 2017 в 11:55
поделиться

5 ответов

For what it's worth, some further notions:

  1. On Windows, renameTo() seems to fail if the target directory exists, even if it's empty. This surprised me, as I had tried on Linux, where renameTo() succeeded if target existed, as long as it was empty.

    (Obviously I shouldn't have assumed this kind of thing works the same across platforms; this is exactly what the Javadoc warns about.)

  2. If you suspect there may be some lingering file locks, waiting a little before the move/rename might help. (In one point in our installer/upgrader we added a "sleep" action and an indeterminate progress bar for some 10 seconds, because there might be a service hanging on to some files). Perhaps even do a simple retry mechanism that tries renameTo(), and then waits for a period (which maybe increases gradually), until the operation succeeds or some timeout is reached.

In my case, most problems seem to have been solved by taking both of the above into account, so we won't need to do a native kernel call, or some such thing, after all.

25
ответ дан 24 November 2019 в 07:37
поделиться

Чтобы переместить / переименовать файл, вы можете использовать эту функцию:

BOOL WINAPI MoveFile(
  __in  LPCTSTR lpExistingFileName,
  __in  LPCTSTR lpNewFileName
);

Она определена в kernel32.dll.

-2
ответ дан 24 November 2019 в 07:37
поделиться

Вы можете попробовать robocopy . Это не совсем «переименование», но это очень надежно.

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

-2
ответ дан 24 November 2019 в 07:37
поделиться

I know it sucks, but an alternative is to create a bat script which outputs something simple like "SUCCESS" or "ERROR", invoke it, wait for it to be executed and then check its results.

Runtime.getRuntime().exec("cmd /c start test.bat");

This thread may be interesting. Check also the Process class on how to read the console output of a different process.

0
ответ дан 24 November 2019 в 07:37
поделиться

В исходном сообщении запрашивался «альтернативный, надежный подход для быстрого перемещения / переименования с помощью Java в Windows, либо с использованием простого JDK, либо с помощью какой-либо внешней библиотеки».

Другой вариант, еще не упомянутый здесь, - v1.3.2 или новее. библиотеки apache.commons.io , которая включает FileUtils.moveFile () .

Он генерирует исключение IOException вместо того, чтобы возвращать логическое значение false в случае ошибки.

См. Также ответ big lep в этой другой ветке .

19
ответ дан 24 November 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: