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 …

fcoury

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 ??

tRuNkSnEt

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

fcoury

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!

fcoury

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

fcoury

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

fcoury

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

fcoury

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