nome curto x nome longo

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

nome curto x nome longo

Mensagem por Mário Isa »

alguem sabe / no xharbour / uma função que / ao fornecer o nome longo / ele me retorne o nome curto / tipo assim:

? o_nome_curto('c:\documents and settings\datahouse')

resultado:

c:\docume~1\dataho~1

Mário
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

nome curto x nome longo

Mensagem por Pablo César »

Oi Mário !

Pelo que eu sei as funções: SFN2LFN e LFN2SFN são de conversões mas teria que adicionar a fwh.
Encontrei uma função como a que tem no LFN:

Código: Selecionar todos

Function LFNDirectory(cDir,cAttr)
Local aDir, cPath := "", nSlash

IF ( nSlash := RAt( "\", cDir ) ) > 0
   cPath:=HB_AnsiToOem(LFN2SFN(HB_OemToAnsi(SubStr(cDir,1,nSlash))))
   cDir :=SubStr( cDir, nSlash + 1 )
ENDIF

aDir:=Directory( cPath + cDir, cAttr )
AEval(aDir,{|aFile|aFile[1]:=SFN2LFN(HB_OemToAnsi(cPath+aFile[1]))})
Return aDir
Eu quis adaptar para Harbour mas esbarrei com que tais funções são com FW.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

nome curto x nome longo

Mensagem por Pablo César »

Outro jeito é fazer a sua própria função, verificando a existência do arquivo e acionando o DIR do velho DOS com opção /X, direcioná-lo para arquivo e ler-lo. É o jeito que encontrei... mas cuidado não é 100%, pois arquivo gerados em DOS não possuem nomes longos, veja como fiz:

Código: Selecionar todos

Function Main()
SetMode(25,80)
MemoWrit("Arquivo Teste de nome longo.TXT","Exemplo")
aFiles:=Directory("*.TXT","")
? LFNtoShort(aFiles[1,1])
INKEY(0)
Return Nil

Function LFNtoShort(cLongFileName)
Local cRoda, cTxt, cString, nIni, nFim

If !File(cLongFileName)
   Return ""
Endif
cRoda:="DIR "+Chr(34)+cLongFileName+Chr(34)+" /x > curto.txt"
RUN (cRoda) 
cTxt:=MemoRead("curto.txt")
nIni:=At(cLongFileName,cTxt)
cString:=Substr(cTxt,(nIni-13))
nFim:=At(" ",cString)
cString:=Alltrim(Substr(cString,1,(nFim-1)))
If File(cString)
   Return cString
Endif
Return ""
Espero ter ajudado e ficamos no aguardo para saber se algum colega conhece alguma função que possa fazer o memso, quem sabe em C...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

nome curto x nome longo

Mensagem por Pablo César »

Achei este código no neste tópico:

Código: Selecionar todos

FUNCTION cShortName( cLong )
Local cShort := Space(164) + Chr(0)
Local nBuffer := 164
Local nLen

nLen := ShortName( cLong, @cShort, nBuffer )
cShort := Left( cShort, nLen )
Return cShort

DLL STATIC FUNCTION ShortName( lpszLongPath AS STRING, lpszShortPath AS STRING, lBuffer AS LONG ) AS VOID PASCAL FROM "GetShortPathNameA" LIB "kernel32"
Se pudesse compilar, mas está dando Error E0030 Syntax error "syntax error at 'STATIC'" senão poderíamos utilizar a função ShortName/GetShortPathNameA do kernel32. Mas não conseguí compilar em Harbour/MiniGui.

Também achei um código em C# neste neste tópico:

De nome curto para nome longo:

Código: Selecionar todos

using System;
using System.Runtime.InteropServices;
using System.Text;
 
public class _Main
{
          [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
          public static extern int GetLongPathName(
                   [MarshalAs(UnmanagedType.LPTStr)]
                   string path,
                   [MarshalAs(UnmanagedType.LPTStr)]
                   StringBuilder longPath,
                   int longPathLength
                   );
       
          public static void Main()
          {
                   StringBuilder longPath = new StringBuilder(255);
                   GetLongPathName(@"D:\MYTEMP~1\RESOUR~1\sql.txt", longPath, longPath.Capacity);
                   Console.WriteLine(longPath.ToString());
          }
}
De nome longo para nome curto:

Código: Selecionar todos

using System;
using System.Runtime.InteropServices;
using System.Text;
 
public class _Main
{
          [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
          public static extern int GetShortPathName(
                   [MarshalAs(UnmanagedType.LPTStr)]
                   string path,
                   [MarshalAs(UnmanagedType.LPTStr)]
                   StringBuilder shortPath,
                   int shortPathLength
                   );
       
          public static void Main()
          {
                   StringBuilder shortPath = new StringBuilder(255);
                   GetShortPathName(@"D:\My Temp\ResourseProvider\sql.txt", shortPath, shortPath.Capacity);
                   Console.WriteLine(shortPath.ToString());
          }
}
Mas também não sei converter em C para Harbour.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

nome curto x nome longo

Mensagem por Mário Isa »

ok / obrigado
vou testar e te falo

eu já havia resolvido

mas tinha feitos umas ginásticas mil no DOS ///

Mas assim ficaria bem melhor...
Vou testar e falo aki.
Até +
[]
Responder