как установить скрытые свойства файла - PullRequest
1 голос
/ 26 апреля 2011

Я пытаюсь создать статический метод, который позволяет мне скрывать файл.Я нашел какой-то возможный способ сделать это, и я написал это:

public static void hide(File src) throws InterruptedException, IOException {

    if(System.getProperty("os.name").contains("Windows"))
    {
        Process p = Runtime.getRuntime().exec("attrib +h " + src.getPath());
        p.waitFor();
    }
    else
    {
        src.renameTo(new File(src.getParent()+File.separator+"."+src.getName()));
    }
}

К сожалению, это не работает в Windows и ни в Ubuntu ... В учебниках Oracle я нашел этот способ

Path file = ...;

Files.setAttribute(file, "dos:hidden", true);

но я не знаю, как его использовать, потому что мой JDK не имеет класса "Path".Может кто-нибудь помочь мне с методом, который может работать в Unix OS и Windows?

Ответы [ 4 ]

2 голосов
/ 26 апреля 2011

Класс Path был представлен в Java 7.

До Java 7 не было встроенного способа доступа к таким свойствам, поэтому вам придется сделать что-то похожее на то, что вы пытаетесь (и в Unix-y OS нет «скрытого свойства», но все файлы, начинающиеся с ., по умолчанию скрыты).

Относительно вашего звонка exec() есть отличная (если немного устаревшая) статья , в которой перечислены все вещи, которые могут пойти не так, и способы их устранения (к сожалению, это довольно сложный процесс).

И небольшая заметка: new File(src.getParent()+File.separator+"."+src.getName()) можно заменить на new File(src.getParent(), "." + src.getName()), что немного чище.

0 голосов
/ 27 августа 2017

Код обнаружения операционной системы:

public class OperatingSystemUtilities
{
    private static String operatingSystem = null;

    private static String getOperatingSystemName()
    {
        if (operatingSystem == null)
        {
            operatingSystem = System.getProperty("os.name");
        }

        return operatingSystem;
    }

    public static boolean isWindows()
    {
        String operatingSystemName = getOperatingSystemName();
        return operatingSystemName.startsWith("Windows");
    }

    public static boolean isMacOSX()
    {
        String operatingSystemName = getOperatingSystemName();
        return operatingSystemName.startsWith("Mac OS X");
    }

    public static boolean isUnix()
    {
        return !isWindows();
    }
}

Скрытие кода файла:

public static String hideFile(String filePath) throws IOException
{
    Path path = Paths.get(filePath);

    if (OperatingSystemUtilities.isWindows())
    {
        Files.setAttribute(path, "dos:hidden", Boolean.TRUE, LinkOption.NOFOLLOW_LINKS);
        return path.toString();
    } else if (OperatingSystemUtilities.isUnix())
    {
        String filename = path.getFileName().toString();

        if (filename.startsWith("."))
        {
            return path.toString();
        }

        // Keep trying to rename
        while (true)
        {
            Path parent = path.toAbsolutePath().getParent();
            Path newPath = Paths.get(parent + File.separator + "." + filename);

            // Modify the file name when it exists
            if (Files.exists(newPath))
            {
                int lastDotIndex = filename.lastIndexOf(".");

                if (lastDotIndex == -1)
                {
                    lastDotIndex = filename.length();
                }

                Random random = new Random();
                int randomNumber = random.nextInt();
                randomNumber = Math.abs(randomNumber);
                filename = filename.substring(0, lastDotIndex) + randomNumber + filename.substring(lastDotIndex, filename.length());

                continue;
            }

            Files.move(path, newPath);

            return newPath.toString();
        }
    }

    throw new IllegalStateException("Unsupported OS!");
}

Обратите внимание, что вы должны обратить внимание, чтобы избежать конфликта имен файлов при переименовании, чтобы скрыть файл на Unix. Это то, что реализует код, несмотря на маловероятность.

0 голосов
/ 26 апреля 2011

вы не сможете достичь этого с помощью стандартного кода JDK. Класс File предлагает метод isHidden, однако в нем четко указано, что концепция скрытого зависит от файловой системы:

Проверяет, является ли файл с именем этим абстрактный путь - это скрытый файл. Точное определение скрытого зависит от системы. В системах UNIX файл считается скрытым, если его имя начинается с символа точки ( ''). В системах Microsoft Windows файл считается скрытым, если он помечен как таковой в файловая система.

Таким образом, вам нужно написать специфический для платформы код (JNI?), Чтобы скрыть файл.

0 голосов
/ 26 апреля 2011

Если файл не является родительским, getParent () вернет значение null.Возможно, вы хотели, чтобы Unix был

src.renameTo(new File(src.getParent(), '.'+src.getName()));

Path доступен в Java 7.

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