Caminho de um Diretório Simplificado

15 respostas
D

e aew galera blz , olha só , eu to com um pequeno probleminha aqui , preciso pegar o caminho de um diretório para gravar um arquivo dentro , só que eu preciso pegar esse caminho da seguinte maneira , por exemplo o diretório

C:\Arquivos de Programas…

preciso que seja no formato

C:\arquiv~1…

to usando o seguinte código

private File caminho(){ File filename; JFileChooser arquivo = new JFileChooser(); arquivo.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY ); int result = arquivo.showOpenDialog( null ); if ( result == JFileChooser.CANCEL_OPTION ) //Se clique do mouse da caixa de arquivos return null; //n�o foi em cancel ele carrega o arquivo else { filename = arquivo.getSelectedFile(); tcaminho.setText(filename.toString()); return filename; } }

alguem sabe me dizer c isso é possível??

bom mais desde ja obrigado a quem puder me ajudar

15 Respostas

T
Converter um nome normal em um nome curto requer uma API do Windows (JNI e C). Se você tiver paciência de chamar o cmd.exe, vocë pode tentar algo como listar o diretório com "dir /x" e pegar os nomes. Exemplo:
C:[code]
C:\&gtdir  /x "c:\Documents and Settings\Thingol\*.doc"
 Volume in drive C is BELERIAND
 Volume Serial Number is CAFE-BABE

 Directory of c:\Documents and Settings\Thingol

08/08/2001  19:22            1.234.567 SEGURA~1.DOC    Seguranca no Transito.doc
               1 File(s)      1.234.567 bytes
               0 Dir(s)   1.234.567.890 bytes free
gtdir /x "c:\Documents and Settings\Thingol\*.doc" Volume in drive C is BELERIAND Volume Serial Number is CAFE-BABE

Directory of c:\Documents and Settings\Thingol

08/08/2001 19:22 1.234.567 SEGURA~1.DOC Seguranca no Transito.doc
1 File(s) 1.234.567 bytes
0 Dir(s) 1.234.567.890 bytes free
[/code]

D

aff mais isso daria muito trampo … mais valew pela dica …

F

Amigo,

Não sei o quanto você precisa disso, mas caso seja extremamente necessário, seria interessante você utilizar uma library java de Interop de ActiveX chamada Jacob:

http://danadler.com/jacob/

Baixe o binário desta biblioteca, coloca o .jar no classpath do seu projeto e o .dll em algum lugar onde o Java enxergue (pode ser C:\Windows por exemplo). Daí utilize o código abaixo:

package com.testing.activex;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;

public class ActiveXTesting {
	public static void main(String[] args) {
		System.out.println("Nome 8.3 para x.java: " +
				getShortFileName("c:/temp/x.java"));
	}
	
	public static String getShortFileName(String file) {
		ActiveXComponent fso = new ActiveXComponent("Scripting.FileSystemObject");
		Object fsoObject = fso.getObject();
		Object fileObject = 
			Dispatch.call(fsoObject, "GetFile", "c:/temp/x.java").toDispatch();
		return Dispatch.get(fileObject, "ShortName").toString();
	}
}

Funciona perfeito aqui prá mim.

Abraços!

D

fcoury blz

nossa mew é de extrema importancia pra mim poder fazer isso só que
o link que vc postou ai não está sendo acessível , sera que tem outro
jeito de eu pegar esse .jar ??

T

Não é muito trabalhoso assim não ..... veja se é isso! De uma olhada no codigo e aproveite segundo sua necessidade.

P.S: Depedendo do tamanho do buffer o codigo vai precisar de melhorias. Rsrsrsr

import java.io.*;

public class Exec {

	public static void main(String args[]) {

		File f = new File("c:/DIRETORIOQUALQUER/ARQUIVO.txt"); // Coloque o diretório

		String dir = f.getPath();
		
		String osName = System.getProperty("os.name");
		String[] cmd = new String[3];
		
		
		if (osName.equals("Windows NT")||osName.equals("Windows XP")) {
			cmd[0] = "cmd.exe";
			cmd[1] = "/C";
			cmd[2] = "dir /X "+dir;
		} else if (osName.equals("Windows 95")) {
			cmd[0] = "command.com";
			cmd[1] = "/C";
			cmd[2] = "dir /X "+dir;
		}
		 
		try {
			Runtime rt = Runtime.getRuntime();
			Process proc = rt.exec(cmd);
			InputStream in = proc.getInputStream();
			InputStreamReader inr = new InputStreamReader(in);
			BufferedReader br = new BufferedReader(inr);
			String line = null;

			while ((line = br.readLine()) != null)
				System.out.println(line);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
D

fcoury achei a library mais agora ta dando um pequeno erro aqui
vc poderia me ajudar o erro é o seguinte

Exception in thread “main” com.jacob.com.ComFailException: Invoke of: GetFile
Source:
Description:

at com.jacob.com.Dispatch.invokev(Native Method)
    at com.jacob.com.Dispatch.call(Dispatch.java)
    at backupcaminho.ActiveXTesting.getShortFileName(ActiveXTesting.java:25)
    at backupcaminho.Main.main(Main.java:33)

Java Result: 1

F

diego,

Pergunta: você copiou a DLL para o diretório correto?

Se sim, faz o seguinte favor: abre um arquivo texto (pode ser no notepad) e digita o seguinte:

Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.GetFile("c:\temp\x.java")
MsgBox("File: " & file.ShortName)

Depois salva ele como teste.vbs em algum lugar. Depois, clica duas vezes nesse arquivo. Talvez o Windows dê um aviso de segurança, mas pode deixar rodar. Veja se ele abre um pop-up com o nome correto do arquivo (ou diretório).

Valeu!

F

diego,

Esse código que eu postei só está funcionando para nomes de arquivo, não de diretório. Espera um pouco que vou tentar fazer funcionar com diretórios e te aviso se é possível.

Abraços,

D

fcoury

olha só , eu fiz o script q vc falou e deu um erro de arquivo não
encontrado …

e quanto a DLL eu copiei ela , para o diretório C:\WINDOWS\SYSTEM32

F

Achei cara, prá fazer com diretório, troca o “GetFile” por “GetFolder”, veja:

package com.testing.activex;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;

public class ActiveXTesting {
	public static void main(String[] args) {
		System.out.println("Nome 8.3 para x.java: " +
				getShortFileName("c:/Program Files"));
	}
	
	public static String getShortFileName(String file) {
		// creates the ActiveX component
		ActiveXComponent fso = new ActiveXComponent("Scripting.FileSystemObject");
		
		// gets the ActiveX "handler"
		Object fsoObject = fso.getObject();
		
		// calls a method "GetFile" with the parameter passed on the "file" variable 
		Object fileObject = 
			Dispatch.call(fsoObject, "GetFolder", file).toDispatch();
		
		// gets the "ShortName" property of the resulting file object
		return Dispatch.get(fileObject, "ShortName").toString();
	}
}

Desculpa os comentários em inglês, mas eu vou postar esse código no meu blog… :slight_smile:

D

então , pro meu caso eu precisaria somente para diretórios , e não para arquivos , c vc puder me dar essa grande ajuda eu ficarei grato

F

diego,

Vc viu o que eu postei para funcionar para diretórios?

Abraços!

D

nossa cara valew mesmo heim , deu certinho aqui eu estava atraz disso
á dias , muito obrigado nem como te agradecer…

há esse código que vc passou da certinho mais ele pega apenas o caminho curto da primeira pasta , as outras ele não pega por exemplo

C:\Arquivos De Programas\Arquivos Comuns

ele só me retorna ARQUIV~1 será que tem uma maneira de pegar todo
o diretório como caminho curto???

bom mais c não tiver tudo bem , isso eu dou um jeito aqui , vc ja me ajudou d +++

cara mais uma vez obrigado

F

Cara,

Essa é fácil.

Troca a linha:

return Dispatch.get(fileObject, "ShortName").toString();

Por:

return Dispatch.get(fileObject, "ShortPath").toString();

Ok?

De nada… Ah, se der avalia minha resposta (naquele combo Avalie) por favor :slight_smile:

D

agora ficou perfeito . mais uma vez muito obrigado deu certinho aqui
um dia quero ser como vc iuaiuhaiuhahua

mais é isso aew , valeww

Criado 19 de outubro de 2006
Ultima resposta 19 de out. de 2006
Respostas 15
Participantes 4