begin process at 2010 02 10 04:37:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > MSDOSTOWINDOWSFILENAME POUR CONVERTIR LES NOMS MS-DOS DE FICHIER

MSDOSTOWINDOWSFILENAME POUR CONVERTIR LES NOMS MS-DOS DE FICHIER


 Description

Fonction permettant de convertir les noms MS-Dos au format complet selon Windows. Par exemple "c:\mondos~1\monfic~1.txt" devient "c:\mondossier\monfichier.txt"

Le principe est d'utiliser les fonctions de recherche de fichier en explorant les dossiers qui constituent FileName du plus profond au plus superficiel. Ainsi les noms complets s'affichent progressivement.

Astuce à connaître: la différence entre ExtractFilePath et ExtractFileDir. La première fonction renvoie toujours un "\" à la fin de l'extraction, pas la seconde. Très utile !

Le paramètre est FileName. Il se fait ronger progressivement alors que RslFN ne cesse de grossir. A la fin, il ne reste que la racine de FileName (exemple "c:\") alors que RslFN contient tous les dossiers (exemple "mondossier\monfichier.txt"). Le résultat est une simple concaténation.

Mais comme la fonction supporte que FileName soit le nom d'un dossier, j'ai déclaré IsDir afin de rajouter à la fin le "\", témoin pertinent d'un dossier.

Source

  • function MSDosToWindowsFileName(FileName: string):string;
  • function IsDirectory(const Name:string):boolean;
  • var i : integer;
  • begin
  • i:=GetFileAttributes(PChar(Name));
  • IsDirectory:=(i<>-1) and ($10 and i<>0);
  • end;
  • var RslFN : string;
  • SRec : TSearchRec;
  • IsDir : boolean;
  • begin
  • RslFN:='';
  • IsDir:=IsDirectory(FileName);
  • repeat
  • if FindFirst(FileName,faAnyFile,SRec)=0 then
  • begin
  • if RslFN<>'' then RslFN:='\'+RslFN;
  • RslFN:=SRec.Name+RslFN;
  • end;
  • FileName:=ExtractFileDir(FileName);
  • until FileName[Length(FileName)]='\';
  • RslFN:=FileName+RslFN;
  • if (IsDir) and (RslFN[Length(RslFN)]<>'\') then RslFN:=RslFN+'\';
  • MSDosToWindowsFileName:=RslFN;
  • end;
function MSDosToWindowsFileName(FileName: string):string;
  function IsDirectory(const Name:string):boolean;
  var i : integer;
  begin
    i:=GetFileAttributes(PChar(Name));
    IsDirectory:=(i<>-1) and ($10 and i<>0);
  end;
var RslFN : string;
    SRec  : TSearchRec;
    IsDir : boolean;
begin
  RslFN:='';
  IsDir:=IsDirectory(FileName);
  repeat
    if FindFirst(FileName,faAnyFile,SRec)=0 then
      begin
        if RslFN<>'' then RslFN:='\'+RslFN;
        RslFN:=SRec.Name+RslFN;
      end;
    FileName:=ExtractFileDir(FileName);
  until FileName[Length(FileName)]='\';
  RslFN:=FileName+RslFN;
  if (IsDir) and (RslFN[Length(RslFN)]<>'\') then RslFN:=RslFN+'\';
  MSDosToWindowsFileName:=RslFN;
end;

 Conclusion

Vous pouvez toujours aller voir http://altert.family.free.fr/


 Sources du même auteur

RÉCUPÉRER LE KBID DES PATCHS CORRECTIFS INSTALLÉS SUR UNE MA...
Source avec Zip INFORMATIONS POUSSÉES SUR UNE PAGE D'UN TWEBBROWSER
Source avec Zip CORRECTEUR ORTHOGRAPHIQUE EN DIRECT
CODE DE HAMMING (4,8) : TRANSMISSION DE DONNÉES SANS ERREUR ...
MODIFIER L'HORLOGE DU SYSTÈME D'EXPLOITATION

 Sources de la même categorie

Source avec Zip SAUVEGARDE DE PLUSIEURS DISQUES/PARTITIONS par danfranjo
Source avec Zip Source avec une capture FICLOCK : LOCKEZ LES FICHIERS par JulioDelphi
Source avec Zip Source avec une capture MODIFICATION DES EXTENSIONS DE FICHIERS par JeremyLecouvert
EXPLORATION RÉCURSIVE DE RÉPERTOIRE par JeremyLecouvert
Source avec Zip OBTENIR LE PROPRIÉTAIRE D'UN FICHIER (WIN32;NTFS) par ILP

Commentaires et avis

Commentaire de JulioDelphi le 05/11/2004 22:31:00 administrateur CS

Super ton MicrosoftDiskOperatingSystemToMicrosoftWindowsNomDeFichier !

Commentaire de Delphiprog le 05/11/2004 23:50:12 administrateur CS

Pas mal, pas mal...
Pour ceux qui se demandent à quoi correspond la "valeur magique" $10, eh bien il s'agit de FILE_ATTRIBUTE_DIRECTORY. Ca rend le code plus facilement compréhensible.

Commentaire de grandvizir le 06/11/2004 19:27:55

Je l'avais enlevé puisque ça vient de FileCtrls.pas

Commentaire de Delphiprog le 06/11/2004 19:38:42 administrateur CS

OK, le motif est valable.
Seulement, ça peut poser des problèmes de portabilité vers Kylix si l'on remplace des constantes symboliques par leur valeurs. Ou alors, on devrait utiliser les directives de compilation :
{$IFDEF WIN32}$10{$ENDIF}{$IFDEF KYLIX}FILE_ATTRIBUTE_DIRECTORY{$ENDIF}.
Comme ça, tout le monde est content. ;o)

Commentaire de grandvizir le 06/11/2004 20:33:56

Je n'utilise pas Kylix. Mais sinon voilà... ok!

Commentaire de MAURICIO le 08/11/2004 11:42:50

Voici 2 fonctions qui vous font la conversion dans les 2 sens (pratique non?).
Il vous faudra mettre ShellAPI dans les uses unit ...


function FICHEIRO_NOME_CURTO(Const NomeComprido : String) : String;
var aTmp: array[0..255] of char;
begin
  if GetShortPathName(PChar(NomeComprido),aTmp,Sizeof(aTmp)-1)=0
  then Result:= NomeComprido
  else Result:=StrPas(aTmp);
end;

function FICHEIRO_NOME_COMPRIDO(Const NomeCurto : String) : String;
var aInfo: TSHFileInfo;
begin
  if SHGetFileInfo(PChar(NomeCurto),0,aInfo,Sizeof(aInfo),SHGFI_DISPLAYNAME)<>0
  then Result:= String(aInfo.szDisplayName)
  else Result:= NomeCurto;
end;

Les fonctions sont de moi mais la source originale non ...

Commentaire de JulioDelphi le 08/11/2004 18:53:16 administrateur CS

super ton code mauricio, je le garde :D tres court et tres utile.
merci

Commentaire de MAURICIO le 09/11/2004 11:20:00

De rien, toujours à disposition!
Au fait, il semble qu' il ne renvoit que le nom du fichier et pas avec toute l' arborescence:
je vais y jeter un oeil tout à l' heure et je le remettrai comme source!!!

Commentaire de grandvizir le 10/11/2004 17:21:14

Je limite toujours les fonctions SH~ dans mes projets. Je préfère les fonctions basiques de Delphi en ASM. Au moins, on sait ce qu'on fait.

Ceci dit, on ne fait pas tout, et on a alors besoin des astuces de MAURICIO. Et c'est plus court... certes ! Merci encore de sa participation :)

Commentaire de clandestino le 11/11/2004 12:27:02

Sous windows :
getfullpathname et getshortpathname sont les deux apis à utiliser...

Clandestino

Commentaire de grandvizir le 12/11/2004 19:16:53

Unité Windows... Bien vu :)

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales