java - Sådan indstilles Skjult proprerti for en fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at oprette en statisk metode, der lader mig skjule en fil.
Jeg har fundet en mulig måde at gøre det, og jeg skrev dette:


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()));
    }
}


Uheldigvis fungerer dette ikke i Windows og heller ikke på Ubuntu ...
I Oracle 's tuorials har jeg fundet denne vej


Path file = ...;

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


men jeg ved ikke hvordan man bruger det, fordi min JDK ikke har klassen 'Path'.
Kan nogen hjælpe mig med en metode, der kan fungere i Unix OS og Windows?

Bedste reference


Klassen Path blev introduceret i Java 7.


Før Java 7 var der ingen indbygget måde at få adgang til egenskaber som dette, så du bliver nødt til at gøre noget, der ligner det du prøver (og på Unix-OS er der ingen 'skjult ejendom', men alle filer der start med en . er skjult som standard).


Hvad angår dit exec() opkald er der en stor (hvis lidt gammel) artikel, der lister over alle de ting, der kan gå galt, og hvordan man retter det (det er helt en involveret proces, desværre). [13]


Og en mindre note: new File(src.getParent()+File.separator+"."+src.getName()) kan erstattes af new File(src.getParent(), "." + src.getName()), hvilket ville være lidt renere. [14]

Andre referencer 1


Hvis en fil som ikke forælder, vil getParent () returnere null. Måske hvad du ønskede for unix var


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


Path er tilgængelig i Java 7.

Andre referencer 2


du vil ikke kunne opnå dette med standard JDK-kode. Filklassen tilbyder en isHidden-metode, men det står klart, at begrebet skjult er filsystem afhængigt:



  Afprøver om filen er navngivet af denne
  abstrakt stinavn er en skjult fil.
  Den nøjagtige definition af skjult er
  systemafhængigt. På UNIX-systemer a
  filen anses for at være skjult, hvis dens
  navn begynder med en periode karakter
  ( ''). På Microsoft Windows-systemer a
  filen anses for at være skjult, hvis den
  er blevet markeret som sådan i
  filsystem.



Som sådan skal du skrive platformspecifik kode (JNI?) For at skjule en fil.

Andre referencer 3


Operativsystem detekteringskode:


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();
    }
}


Skjule filkoden:


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!");
}


Bemærk at du skal være opmærksom på at undgå et filnavn sammenstød ved omdøbning for at skjule filen på Unix. Dette er, hvad koden implementerer, selv om det er usandsynligt.