2010-07-12 3 views
0

디렉토리Сonvert 유니 코드 (UTF-8) ANSI (DOS)에 파일 이름 깨진 파일 이름과 함께 나열

C:\Downloads\1>dir 
18.01.2010 10:45 <DIR>   РЎР?Р>Р?Р?С?Р+ 
18.01.2010 10:45 <DIR>   Р?Р?С'Р?Р>Р?Рє 
18.01.2010 10:45 <DIR>   Р"Р?С?Р?Р°С╪Р°-Р>РчС╪РчР+Р?Рё РєР?С?РїС?С? 
18.01.2010 10:45 <DIR>   Р•Р>Р•Р?РўР Р?Р?Р? 

인코딩은 ANSI로 UTF-8에서 파일 이름을 변환하는 창에 대한 모든 도구가 있습니까?

+0

나는이 질문이 잘못된 포럼에서 제기되었다고 생각합니다. 파워 유저 도구 (serverfault, codeproject, 뭐든간에 ...)가 필요하거나 답을 제공 할 수있는 링크를 제공하거나 소스 코드 (또는 적어도 소스 코드 조각)가 필요하다면 질문에 잘못 대답하고 아래 답변이 부적절합니다. – paercebal

+0

나는 다음과 같이 확인했다 :이 질문은 수퍼 유저에게 물어 봤어야한다 : http://superuser.com/questions/156189/how-to-convert-word-doc-to-pdf-in-linux는 비슷하다. (어떻게 변환 하는가? 리눅스에서 뭔가) – paercebal

답변

0

하나 있습니다. 나는 오늘 혼자서 그것을 만들었다.

unit main; 
interface 
uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ComCtrls, ExtCtrls, SHLOBJ, Buttons, Grids; 

type 
    TForm1 = class(TForm) 
    StatusBar1: TStatusBar; 
    Panel1: TPanel; 
    Button3: TButton; 
    SpeedButton1: TSpeedButton; 
    Button2: TButton; 
    Edit2: TEdit; 
    Edit1: TEdit; 
    Button1: TButton; 
    Label1: TLabel; 
    Panel2: TPanel; 
    Memo1: TMemo; 
    Panel3: TPanel; 
    Memo2: TMemo; 
    Panel4: TPanel; 
    ProgressBar1: TProgressBar; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure Button3Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 
{$LongStrings On} 
procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string); 
var 

    SR: TSearchRec; 
    DirList: TStringList; 
    IsFound: Boolean; 
    i: integer; 
begin 
    if StartDir[length(StartDir)] <> '\' then 
    StartDir := StartDir + '\'; 
    IsFound := FindFirst('\\?\' + StartDir+FileMask, faAnyFile-faDirectory, SR) = 0; 
    while IsFound do begin 
    FilesList.Add(StartDir + SR.Name); 
    IsFound := FindNext(SR) = 0; 
    end; 
    FindClose(SR); 

    DirList := TStringList.Create; 
    IsFound := FindFirst('\\?\' + StartDir + '*.*', faAnyFile, SR) = 0; 
    while IsFound do begin 
    if ((SR.Attr and faDirectory) <> 0) and 
     (SR.Name[1] <> '.') then 
     DirList.Add(StartDir + SR.Name); 
    IsFound := FindNext(SR) = 0; 
    end; 
    FindClose(SR); 

    for i := 0 to DirList.Count - 1 do 
    FindFiles(FilesList, DirList[i], FileMask); 
    DirList.Free; 
end; 

function BrowseForFolder(var Foldr: string; Title: string): Boolean; 
var 
    BrowseInfo: TBrowseInfo; 
    ItemIDList: PItemIDList; 
    DisplayName: array[0..MAX_PATH] of Char; 
begin 
    Result := False; 
    FillChar(BrowseInfo, SizeOf(BrowseInfo), #0); 
    with BrowseInfo do begin 
    hwndOwner := Application.Handle; 
    pszDisplayName := @DisplayName[0]; 
    lpszTitle := PChar(Title); 
    ulFlags := BIF_RETURNONLYFSDIRS; 
    end; 
    ItemIDList := SHBrowseForFolder(BrowseInfo); 
    if Assigned(ItemIDList) then 
    if SHGetPathFromIDList(ItemIDList, DisplayName) then begin 
     Foldr := DisplayName; 
     Result := True; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Foldr: string; 
    FilesList: TStringList; 
    i: Integer; 
begin 

    if BrowseForFolder(Foldr, 'Select a source folder') then begin 
    Edit1.Text := Foldr; 
    Edit2.Text := ''; 
    Button3.Enabled:= false; 
    ProgressBar1.Position := 0; 
    Button2.Enabled:= true; 

    FilesList := TStringList.Create; 
    try 
    FindFiles(FilesList, Edit1.Text, '*.*'); 
    for i:= 0 to FilesList.Count-1 do 
     FilesList[i] := Copy(FilesList[i], Length(Edit1.Text)+2, Length(FilesList[i])); 
    Memo1.Lines.Assign(FilesList); 

    Label1.Caption := 'Files found: ' + IntToStr(FilesList.Count); 
    finally 
    FilesList.Free; 
    end; 

    end else begin 
    Button2.Enabled:= false; 
    Button3.Enabled:= false; 
    Edit1.Text := ''; 
    end; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    Foldr: string; 
    i: Integer; 
begin 
    if BrowseForFolder(Foldr, 'Select a destination folder') then begin 
    Edit2.Text := Foldr; 
    Button3.Enabled:= true; 
    for i := 0 to Memo1.Lines.Count - 1 do 
    begin 
     Memo2.Lines.Add(Utf8ToAnsi(Memo1.Lines[i])); 
    end; 
    end else begin 
    Edit2.Text := ''; 
    Button3.Enabled:= false; 
    end; 
end; 

procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ; 
begin 
    Assert(Assigned(Strings)) ; 
    Strings.Clear; 
    Strings.Delimiter := Delimiter; 
    Strings.DelimitedText := Input; 
end; 

procedure TForm1.Button3Click(Sender: TObject); 
var 
    i,j, error : Integer; 
    DestDir: String; 
begin 
    Button1.Enabled:= false; 
    Button2.Enabled:= false; 
    Button3.Enabled:= false; 
    StatusBar1.Panels[0].Text := 'Parsing directory names...'; 
    for i := 0 to Memo1.Lines.Count - 1 do 
    begin 
     j := LastDelimiter('\', Memo2.Lines[i]); 
     DestDir := '\\?\' + Edit2.Text + '\' + Copy(Memo2.Lines[i], 0, j-1); 
     if not DirectoryExists(DestDir) then begin 
     {$IOChecks off} 
     ForceDirectories(DestDir); 
     // Did the directory get created OK? 
     error := IOResult; 
     if error <> 0 
     then ShowMessageFmt('Directory creation failed with error %d',[error]); 
     {$IOChecks on} 
     end; 
    end; 
    StatusBar1.Panels[0].Text := 'Copying...'; 
    for i := 0 to Memo1.Lines.Count - 1 do 
    begin 
     if ProgressBar1.Position <> Round((100/Memo1.Lines.Count) * i) then begin 
     ProgressBar1.Position := Round((100/Memo1.Lines.Count) * i); 
     Button3.Caption := IntToStr(Round((100/Memo1.Lines.Count) * i)) + '%'; 
     end; 
     CopyFile(PChar('\\?\' + Edit1.Text + '\' + Memo1.Lines[i]), PChar('\\?\' + Edit2.Text + '\' + Memo2.Lines[i]), False); 
    end; 
    Button1.Enabled:= True; 
    ProgressBar1.Position := 100; 
    Button2.Enabled:= True; 
    Button3.Enabled:= True; 
    Button3.Caption := 'Convert'; 
    StatusBar1.Panels[0].Text := 'Ready!'; 
    ShowMessageFmt('Converted %d files', [i]); 
end; 
end. 
+0

-1 : 아마도 직접 실행 파일에 링크하는 대신 소스를 게시해야합니다. 'WideCharToMultiByte' WIN32 API 함수를 사용하면 완전한 실행 파일/projet/어떤 것이 필요하지 않습니다. 개발자가 소스/예제를 공유 할 수있는 포럼이며, 실행 가능한 링크 저장소가 아닙니다. – paercebal

+0

실행 파일에 대한 링크가 200 줄의 Delphi 소스로 대체 된 후 "-1"(이 답변에 대한 저의 downmod)이 선택 취소되었습니다. 질문은 여전히 ​​다른 곳에 있습니다. – paercebal

+0

ANSI는 CP866이 아닙니다. 어쨌든,이 소스를 사용하여 프랑스어 기반 Windows XP에서 러시아어 UTF-8 파일 이름을 올바른 DOS로 표시되는 파일 이름으로 변환하는 데 의의가 있습니다. (저는 델파이가 없기 때문에 시도조차하지 않을 것입니다 ...). – paercebal

관련 문제