Как проверить, является ли местоположение (String) допустимым путем сохранения в Java? - PullRequest
4 голосов
/ 28 июня 2011

Я получаю строку от пользователя, которую следует использовать в качестве места для сохранения содержимого в файл. Эта строка должна содержать достаточно информации, например, каталог + имя файла.

Мой вопрос: как я могу проверить, является ли предоставленная строка допустимым путем для сохранения содержимого в файл (по крайней мере, в теории)?

Не имеет значения, созданы ли каталоги или нет, или есть ли у пользователя надлежащий доступ к самому местоположению. Меня интересует только проверка структуры предоставленной строки.

Как мне поступить? Я думал о создании File объекта, а затем извлечения его URI. Есть ли лучший способ?

Ответы [ 4 ]

10 голосов
/ 28 июня 2011

Вы можете использовать File.getCanonicalPath () для проверки в соответствии с текущими правилами ОС.

import java.io.File;
import java.io.IOException;

public class FileUtils {
  public static boolean isFilenameValid(String file) {
    File f = new File(file);
    try {
       f.getCanonicalPath();
       return true;
    }
    catch (IOException e) {
       return false;
    }
  }

  public static void main(String args[]) throws Exception {
    // true
    System.out.println(FileUtils.isFilenameValid("well.txt"));
    System.out.println(FileUtils.isFilenameValid("well well.txt"));
    System.out.println(FileUtils.isFilenameValid(""));

    //false
    System.out.println(FileUtils.isFilenameValid("test.T*T"));
    System.out.println(FileUtils.isFilenameValid("test|.TXT"));
    System.out.println(FileUtils.isFilenameValid("te?st.TXT"));
    System.out.println(FileUtils.isFilenameValid("con.TXT")); // windows
    System.out.println(FileUtils.isFilenameValid("prn.TXT")); // windows
    }
  }
2 голосов
/ 28 июня 2011

Вы смотрели на Apache Commons IO ? Эта библиотека включает в себя различные вещи для обработки информации о пути, которые могут помочь, например, FilenameUtils.getPath(String filename), который возвращает путь от полного имени файла.

1 голос
/ 28 июня 2011

Самый простой: попытайтесь сохранить, прослушайте исключения.

Единственный раз, когда я сделал бы что-то более сложное, было бы, если бы запись была отложена, и вы хотите дать пользователю его отзыв сейчас .

0 голосов
/ 28 июня 2011

Вот что у меня есть:

private static boolean checkLocation(String toCheck) {

    // If null, we necessarily miss the directory section
    if ( toCheck == null ) {
        System.out.println("Missing directory section");
        return false;
    }

    String retrName = new File(toCheck).toURI().toString();

    // Are we dealing with a directory?
    if ( retrName.charAt(retrName.length()-1) == '/') {
        System.out.println("Missing file name");
        return false;
    }

    return true;

}

Это говорит мне, есть ли у меня правильная структура каталогов и указываю ли я на каталог, а не на файл. Мне не нужен доступ к I / O.

Я заметил, что если я использую метод File.createNewFile() в местоположении, явно указывающем на каталог (который еще не существует), Java создает файл без расширения, что совершенно неправильно. Либо он должен создать каталог, либо он должен выдать какую-то ошибку.

Кроме того, конструкторы File, как правило, добавляют текущий каталог, если в аргументе ничего не указано. Это не задокументировано, но никакого реального вреда в моем случае нет.

Если у кого-то есть лучшее решение, я его одобрю.

EDIT

Я наконец объединил вышеупомянутое с вводом от RealHowTo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...