2016-12-02 4 views
0

Я продолжаю получать файл или каталог не существует. Я запускаю скрипт Groovy, создающий контекст приложения Spring. Я легко читаю в другом файле, используя тот же тип пути. Тем не менее, файл, который я читаю, находится в пути класса Spring. Этот скрипт может запускаться любым количеством людей с разными файловыми системами, поэтому я не могу жестко закодировать путь. Мне нужен относительный путь.Сохранение нового файла в любой каталог Groovy

Это выше в классе, но важная информация.

private static String saveFilesToLocation = "/retrieve/"; 

Вот код.

CSVReader reader = new CSVReader(new InputStreamReader(balanceFile), SEPARATOR) 
    String[] nextLine 
    int counter = 0; 
    while ((nextLine = reader.readNext()) != null) { 
     counter++ 
     if (nextLine != null && (nextLine[0] != 'FileLocation')) { 
      counter++; 
      try { 

       //Remove 0, only if client number start with "0". 
       String fileLocation = nextLine[0]; 

       byte[] fileBytes = documentFileService.getFile(fileLocation); 
       if (fileBytes != null) { 
        String fileName = fileLocation.substring(fileLocation.indexOf("/") + 1, fileLocation.length()); 
        File file = new File(saveFilesToLocation+fileLocation); 
        file.withOutputStream { 
         it.write fileBytes 
        } 

        println "$counter) Wrote file ${fileLocation} to ${saveFilesToLocation+fileLocation}" 
       } else { 
        println "$counter) UNABLE TO RETRIEVE FILE: $fileLocation"; 
       } 

      } catch (Exception e) { 
       e.printStackTrace() 
      } 
     } 
    } 

Пути в строках имеют то, что я ожидал бы в них, никаких дополнительных символов.

UPDATE:

Спасибо loteq Ваш ответ будет работать также, и имеет лучшую grooviness, чем наш конечный результат, который работал. Поскольку это своего рода одно, у нас нет времени, чтобы перейти на более приятную версию.

Вот код, который сработал для нас, он идентичен выше, за исключением того, что saveFilesToLocation установлен в каталог, который уже существует. Тот, который раньше не существовал, и нам нужно было бы назвать mkdir, как loteq .

private static String saveFilesToLocation = "/tmp/retrieve/"; 


    CSVReader reader = new CSVReader(new InputStreamReader(balanceFile), SEPARATOR) 
    String[] nextLine 
    int counter = 0; 
    while ((nextLine = reader.readNext()) != null) { 
     if (nextLine != null && (nextLine[0] != 'FileLocation')) { 
      counter++; 
      try { 

       //Remove 0, only if client number start with "0". 
       String fileLocation = nextLine[0]; 

       byte[] fileBytes = documentFileService.getFile(fileLocation); 
       if (fileBytes != null) { 
        String fileName = fileLocation.substring(fileLocation.indexOf("/") + 1, fileLocation.length()); 
        File file = new File(saveFilesToLocation+fileName); 
        file.withOutputStream { 
         it.write fileBytes 
        } 

        println "$counter) Wrote file ${fileLocation} to ${saveFilesToLocation+fileLocation}" 
       } else { 
        println "$counter) UNABLE TO RETRIEVE FILE: $fileLocation"; 
       } 

      } catch (Exception e) { 
       e.printStackTrace() 
      } 
     } else { 
      counter++; 
     } 
    } 

ответ

1

В коде есть что-то, но я не могу быть уверенным, что это ошибка.

Вы вычисляете имя файла и не используете его для создания целевого файла. Вместо этого вы просто добавляете исходный путь к префиксу saveFilesToLocation:

   String fileName = fileLocation.substring(fileLocation.indexOf("/") + 1, fileLocation.length()); 
       File file = new File(saveFilesToLocation+fileLocation); 

Это кажется странным.

Затем, если fileLocation содержит каталоги, которые необходимо создать, тогда вам нужно mkdirs(), иначе вы получите сообщение об ошибке.

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

Первые позволяет работать с фактическим файлом объекты вместо если строки:

private static File saveFilesToLocationDir = saveFilesToLocation as File 

версия, которая предполагает ошибку в приведенной выше коде:

private static String saveFilesToLocation = "/retrieve/"; 

private static File saveFilesToLocationDir = saveFilesToLocation as File 

CSVReader reader = new CSVReader(new InputStreamReader(balanceFile), SEPARATOR) 
String[] nextLine 
int counter = 0; 
while ((nextLine = reader.readNext()) != null) { 
    counter++ 
    if (nextLine != null && (nextLine[0] != 'FileLocation')) { 
     counter++; 
     try { 

      //Remove 0, only if client number start with "0". 
      String fileLocation = nextLine[0]; 

      byte[] fileBytes = documentFileService.getFile(fileLocation); 
      if (fileBytes != null) { 

       int firstSlash = fileLocation.indexOf("/") + 1 
       String fileName = fileLocation[firstSlash..-1] 

       File destination = new File(saveFilesToLocationDir, fileName) 
       destination.parentFile.mkdirs() 

       destination.withOutputStream { it << fileBytes } 

       println "$counter) Wrote file ${fileLocation} to ${destination.absolutePath}" 
      } else { 
       println "$counter) UNABLE TO RETRIEVE FILE: $fileLocation"; 
      } 

     } catch (Exception e) { 
      e.printStackTrace() 
     } 
    } 
} 

версии, которая не использует созданную Filename (как вы):

private static String saveFilesToLocation = "/retrieve/"; 

private static File saveFilesToLocationDir = saveFilesToLocation as File 

CSVReader reader = new CSVReader(new InputStreamReader(balanceFile), SEPARATOR) 
String[] nextLine 
int counter = 0; 
while ((nextLine = reader.readNext()) != null) { 
    counter++ 
    if (nextLine != null && (nextLine[0] != 'FileLocation')) { 
     counter++; 
     try { 

      //Remove 0, only if client number start with "0". 
      String fileLocation = nextLine[0]; 

      byte[] fileBytes = documentFileService.getFile(fileLocation); 
      if (fileBytes != null) { 

       int firstSlash = fileLocation.indexOf("/") + 1 
       String fileName = fileLocation[firstSlash..-1] 

       File destination = new File(saveFilesToLocationDir, fileLocation) 
       destination.parentFile.mkdirs() 

       destination.withOutputStream { it << fileBytes } 

       println "$counter) Wrote file ${fileLocation} to ${destination.absolutePath}" 
      } else { 
       println "$counter) UNABLE TO RETRIEVE FILE: $fileLocation"; 
      } 

     } catch (Exception e) { 
      e.printStackTrace() 
     } 
    } 
}