Página 1 de 1
nome curto x nome longo
Enviado: 28 Out 2011 16:21
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
nome curto x nome longo
Enviado: 28 Out 2011 18:22
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.
nome curto x nome longo
Enviado: 28 Out 2011 18:47
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...
nome curto x nome longo
Enviado: 28 Out 2011 21:31
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.
nome curto x nome longo
Enviado: 28 Out 2011 21:41
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é +
[]