Właściciel pliku - Windows XP

0

Witam,

Jak dotrzeć do pola "Właściciel" danego pliku za pośrednictwem java'y?
Wartość tego pola widoczna jest np. w eksploratorze windows, a ja chciałbym móc ją odczytać oraz w miarę możliwości również edytować za pośrednictwem programu w javie.

Czy ktoś wie może jak to zrobić?
Nie chodzi mi o cały program tylko wskazówki jak dotrzeć do windowsowskich parametrów pliku, jakie je czytać i jak ewentualnie edytować.

Z góry dziękuję,

K.

0

Będziesz musiał użyć JNI, bo w czystej implementacji javy nie ma obsługi specyficznych właściwości dla konkretnej platformy:
http://www.telio.be/blog/2007/06/26/getting-the-file-owner-in-java-using-jni/

0

Pobrac wlasciciela pliku mozna uzywajac komendy dir. String s = Runntime.getRunntime().exec("dir /q c:");
Przetwarzajac otrzymanego stringa mozna wycaiganc wlascicieli plikow. Pisalem z pamieci wiec moga byc bledy.

0

Dzięki za odpowiedzi, ale chyba nie skonkretyzowałem o co chodzi.
Chodzi o to, żeby informacje te były pobierane również ze zmapowanego dysku sieciowego (np. udział Samba).

Eksplorator Windows wyświetla właściciela niezależnie czy chodzi o dysk C: czy o zmapowany dysk Z:, natomiast zarówno wspomniany przykład JNI jak i "dir /Q" dla zmapowanego dysku wyświetlają "null".
Do TotalCommandera jest dodatek ("shelldetails"), który pozwala wyświetlać wszystkie kolumny/pola dostępne w Eksploratorze Windows i działa to bardzo dobrze.
Ja muszę taką informację wczytać do mojej aplikacji Java i nie wiem jak to zrobić.

To znaczy jest rozwiązanie w postaci parsowania wyjścia z "subinacl.exe" i to rozwiązanie przynosi oczekiwane efekty, ale przy dużej ilości plików wydajność pozostawia wiele do życzenia.

Może jest jakiś sposób z użyciem Windowsowego DLL i getRunTime().exec(), "rundll32"?

Pozdrawiam,

0

Isr podał tylko wysokopoziomową wersję rozwiązania, które podał kaziuuu. Niezależnie od metody oba rozwiązania łamią przenośność programu między systemami (w wersji wysokopoziomowej i tak trzeba parsować wyjście z jakiegoś polecenia systemowego). Będzie to trwało tak długo, aż Java nie zacznie posiadać własnej, niezależnej od platformy obsługi własności plików i praw dostępu do nich. A to może nie nastąpić szybko lub wcale. Realnie musisz się dostać do danych posiadanych przez Windows - a to oznacza, że musisz skorzystać z interfejsu tego systemu - najczęściej jakiegoś pliku binarnego komunikującego się z WinAPI. Najlepiej zapytać się o to na forum C++. W końcu w tym języku jest napisany Windows.

0

Przykładowy program do wyciągnięcia właściciela folderu WINDOWS:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.regexp.RE;

public class FileOwner {
	public static void main(String[] args) throws Exception {
		RE re = new RE("free");
		RE dateFormat = new RE("([0-9]+)-([0-9]+)-([0-9]+)");
		String cmd = "cmd.exe";
		Process proc = Runtime.getRuntime().exec(cmd);
		InputStream in = proc.getInputStream();
		OutputStream out = proc.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(out);
		byte[] buff = new byte[256];
		BufferedInputStream bis = new BufferedInputStream(in);
		int lenght;
		StringBuffer stBuff = new StringBuffer();
		bos.write(new String("dir /q c:\\\n").getBytes());
		bos.flush();
		while ((lenght = bis.read(buff, 0, 256)) != -1) {
			stBuff.append(new String(buff, 0, lenght, "US-ASCII"));
			
			if(re.match(stBuff.toString())) {
				break;
			}
		}
		proc.destroy();
		String message = stBuff.toString();
		for(String line: message.split("\\n")) {
			String values[] = line.split("\\s+");
			if(values.length >= 5) {
				if(dateFormat.match(values[0])) {
					if (values[4].equals("WINDOWS")) {
						System.out.println("WINDOWS folder owner: " + values[3]);
					}
				}
			}
		}
	}
}

@Edit nie wiedziałem, że po lsr ktoś jeszcze napisał :D

0

Witam raz jeszcze...

Znalazłem jednak odpowiedź na moją zagadkę ;)
Rzeczywiście da się to zrobić przez JNI - na razie mam wersję roboczą, jak tylko opracuję full=wypas dam znać.

Przykład JNI:
http://www.telio.be/blog/2007/06/26/getting-the-file-owner-in-java-using-jni/
daje rade - trzeba tylko było podłubać i zmienić C++.

W przykładzie ze strony autor założył, że poszukiwania dotyczą kont na komputerze lokalnym, ale wystarczy zmienić pierwszy parametr funkcji LookupAccountSid z NULL na "NazwaSerweraCzyKompaSieciowego" i wówczas wszystko śmiga ;)

Tak jak mówiłem, muszę to jeszcze opracować, ale będzie git a powyższe wyjaśnienie być może komuś już teraz pomoże.

Wrócę z gotową wersją i własną opinią nt. wydajności tego "cuda" ;)

A czy komuś wiadomo coś nt. java.nio.file.attribute (np. FileOwnerAttributeView)?

Pozdr.

K.

1 użytkowników online, w tym zalogowanych: 0, gości: 1