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
nome curto x nome longo
Moderador: Moderadores
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
nome curto x nome longo
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:Eu quis adaptar para Harbour mas esbarrei com que tais funções são com FW.
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 aDirUm 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.
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.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
nome curto x nome longo
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:
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...
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 ""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.
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.
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
nome curto x nome longo
Achei este código no neste tópico:
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:
De nome longo para nome curto:
Mas também não sei converter em C para Harbour.
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"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());
}
}
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());
}
}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.
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

- Mensagens: 907
- Registrado em: 07 Jul 2004 13:54
- Localização: Ilha Solteira-sp
nome curto x nome longo
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é +
[]
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é +
[]