събота, 9 февруари 2013 г.

Преместване на файлове

Методът renameTo на класа File в езика Java извършва преименуване на файл. Това може да се използва за преместване на файл от една директория в друга.

В една програма на Java, работеща под Linux, срещнах проблеми с реализираното по този начин преместване на файл от една директория в друга.

В следващата конструкция, с оператор if, методът renameTo упорито връщаше резултат false и файлът просто не се появяваше в целевата директория:

if(srcFile.renameTo(dstFile))

Когато замених предишния ред със следващата конструкция, всичко тръгна нормално и файлът се преместваше успешно от едната директория в другата:

if(patchMoveFile(srcFile.getAbsolutePath(),
                 dstFile.getAbsolutePath()))

Тук новонаписаният допълнителен метод patchMoveFile премества файл по най-прост начин, като чете файла, записва го в друг файл и след това изтрива първия файл:

private boolean patchMoveFile(String srcFileName,
                              String dstFileName)
{
  InputStream inStream = null;
  OutputStream outStream = null;
  boolean r = false;

  try
  {
    File inFile = new File(srcFileName);
    File outFile = new File(dstFileName);     
    inStream = new FileInputStream(inFile);
    outStream = new FileOutputStream(outFile);
    byte[] buffer = new byte[1024];
    int length;
  
    while ((length = inStream.read(buffer)) > 0)
    {
      outStream.write(buffer, 0, length);
    }
    inStream.close();
    outStream.close();
    inFile.delete();
    r = true;
  }
  catch(IOException e)
  {
    e.printStackTrace();
  }
  return r;
} // patchMoveFile

Значи, конструкцията с метода renameTo не искаше да работи, а с метода patchMoveFile заработи правилно в съвсем същия контекст на програмата/системата.

Това ми напомня, че за постигането на надеждност на програмите трябва да се използват конструкции, които работят без проблеми в различни възможни контексти/условия/системи/ситуации.
 

Няма коментари:

Публикуване на коментар