2009-08-18 12 views
21

Piszę aplikację w Javie używając SWT. Chciałbym stworzyć unikalną nazwę pliku. Ale nie chcę tworzyć go na dysku twardym. Dodatkowa funkcjonalność: Chcę utworzyć niepowtarzalną nazwę pliku w określonym folderze.Jak utworzyć nazwę pliku tmp bez tworzenia pliku

public String getUniqueFileName(String directory, String extension) { 
     //create unique file name 
} 
+0

Jeśli nie utworzyć plik , co masz na myśli mówiąc "unikatowy"? Czy masz na myśli "inny niż wszystkie inne nazwy plików w tym katalogu"? – lindelof

+0

Chciałbym utworzyć niepowtarzalną nazwę pliku: "różni się od wszystkich innych nazw plików w tym katalogu "- dokładnie: –

+4

@mykhaylo: Zdaj sobie sprawę, że jeśli nie od razu utworzysz plik używając unikalnej nazwy pliku, które uzyskujesz, istnieje możliwość, że inny plik o tej nazwie może się pojawić w rzeczywistości mi. Nawet niektóre z przedstawionych odpowiedzi nie uwzględniają tej możliwości. –

Odpowiedz

7

Użyj znacznika czasu w nazwie pliku?

Oczywiście może to nie działać, jeśli masz bardzo wysoką współbieżność.

Na przykład:

public String getUniqueFileName(String directory, String extension) { 
    return new File(directory, new StringBuilder().append("prefix") 
     .append(date.getTime()).append(UUID.randomUUID()) 
     .append(".").append(extension).toString()).getAbsolutePath(); 
} 

AS odpowiedź John Oxley sugeruje. UUID może być rozwiązaniem, ponieważ można użyć 4 różnych schematów do ich utworzenia. Chociaż wciąż istnieje niewielka szansa na kolizję. Jeśli połączysz znacznik czasu z losowym identyfikatorem UUID, szanse na kolizję staną się znikome.

1

Można utworzyć plik z dowolną nazwą (godzina, identyfikator GUID itp.), A następnie przetestować go, aby sprawdzić, czy już istnieje. Jeśli tak, spróbuj podać inną nazwę, aby zobaczyć, czy jest unikatowa.

File f = new File(guid); 
if (f.exists()) { 
    //try another guid 
}else{ 
    //you're good to go 
} 
+5

@Nick: między 'f.exists()' i '// jesteś gotowy do pracy' plik z tą nazwą może pojawić się w systemie plików. –

14

Od swoje pytanie zakładam widzieliście że File.createTempFile() zawsze tworzy plik, a nie tylko pozwala na generowanie nazwy.

Ale dlaczego nie po prostu wywołać metodę, a następnie usunąć utworzony plik tymczasowy? createTempFile() wykonuje całą pracę polegającą na wyszukiwaniu unikatowych nazw plików w określonym katalogu, a ponieważ utworzyłeś plik, możesz być pewien, że go usuniesz.

File f = File.createTempFile("prefix",null,myDir); 
String filename = f.getName(); 
f.delete(); 
+11

@Dave: Po 'f.delete()' nazwa pliku nie ma już gwarancji, że będzie unikalna. Zaraz po usunięciu utworzonego przez 'createTempFile()' inny plik o tej samej nazwie może pojawić się w systemie plików. –

+0

@Grant Wagner: Dokładnie. Dlatego operacja musi być atomowa. Jeśli chcesz wygenerować losową nazwę, a nie tylko połączyć sygnaturę czasową z pewnymi liczbami losowymi: – polvoazul

+1

@polvoazul: Niestety nie ma sposobu, aby zrobić to, co @ michał-ziober pyta i zagwarantować, że nazwa pliku nadal nie jest używana w tym katalogu. Nie z identyfikatorem GUID/UUID, a nie z sygnaturami czasowymi i liczbami losowymi. To po prostu niemożliwe. Odpowiedź @ dave-webb jest najbliższa do osiągnięcia standardu (przez wywołanie wbudowanego 'File.createTempFile'). Usunięcie pliku po jest wykonywane tylko po to, aby spełnić pierwotne ograniczenia dotyczące pytań. – onlynone

1

innej wersji

uprościła inne odpowiedzi, Wykorzystanie GUID. imho nie trzeba dodawać sól do UUID. To właśnie używam:

public static String getUniqueFileName(String directory, String extension) { 
    String fileName = MessageFormat.format("{0}.{1}", UUID.randomUUID(), extension.trim()); 
    return Paths.get(directory, fileName).toString(); 
} 
  • Zauważ, że plik nie jest tworzony, funkcja ta po prostu zwraca unikalną nazwę pliku jako ciąg

Wykorzystanie:

String uniqueFileName = getUniqueFileName("/tmp", "pdf"); 
System.out.println(uniqueFileName); 

wyjście

/tmp/f34a960a-6001-44d6-9aa7-93ec6647a64a.pdf 
0

można utworzyć rzeczywisty unikalny katalog (podkatalog), a następnie dowolny plik w środku powinien być unikalny, na przykład "myFile."+ Przedłużenie

public static String getUniqueFileName(String directory, String extension) { 
    try 
    { 
     // create actual unique subdirectory in the given directory 
     // 
     File myUniqueDir = File.createTempFile("udir", null,directory); 
     String filename = myUniqueDir.getName(); 
     myUniqueDir.delete(); // don't want the file but a directory 
     myUniqueDir.mkdirs(); 
    } 
    //todo: catch .... 

    // for example: 
    return directory + "/" + myUniqueDir + "/myFile." + extension; 
    } 

procedura ta powinna pracować w normalnych sytuacjach nawet z współbieżności. Chyba zaczniemy myśleć w procesach tropiących, które chcą zająć nasz nowy katalog lub podobnych rzeczy.

Powiązane problemy