View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000990 | Double Commander | File operations | public | 2015-01-16 18:49 | 2021-09-05 15:11 |
Reporter | holger | Assigned To | Alexx2000 | ||
Priority | normal | Severity | feature | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Projection | none | ETA | none | ||
Product Version | 0.6.0 (trunk) | ||||
Target Version | 0.9.0 | Fixed in Version | 0.9.0 | ||
Summary | 0000990: Creation of shortcuts *.lnk in addition to symbolic links | ||||
Description | On Windows it is common to use shortcuts *.lnk in addition to symbolic links. I extended the dialog for symbolic links to get the ability to create both. A patch file is attached. Remark: The symbolic links DC creates work fine for directories but for a file they only work with administrator privileges. | ||||
Tags | No tags attached. | ||||
Attached Files | fsymlink.patch (4,184 bytes)
Index: fsymlink.lfm =================================================================== --- fsymlink.lfm (revision 5790) +++ fsymlink.lfm (working copy) @@ -120,4 +120,15 @@ ModalResult = 2 TabOrder = 3 end + object CheckBoxLnk: TCheckBox + Left = 272 + Height = 24 + Top = 136 + Width = 93 + Anchors = [akTop, akRight] + Caption = 'Create .lnk' + Checked = True + State = cbChecked + TabOrder = 4 + end end Index: fsymlink.pas =================================================================== --- fsymlink.pas (revision 5790) +++ fsymlink.pas (working copy) @@ -10,6 +10,7 @@ { TfrmSymLink } TfrmSymLink = class(TForm) + CheckBoxLnk: TCheckBox; lblExistingFile: TLabel; lblLinkToCreate: TLabel; edtExistingFile: TEdit; @@ -43,6 +44,9 @@ try edtLinkToCreate.Text := sLinkToCreate; edtExistingFile.Text := sExistingFile; + {$IFNDEF MSWINDOWS} + CheckBoxLnk.Visible := false; + {$ENDIF} Result:= (ShowModal = mrOK); finally Free; @@ -67,9 +71,10 @@ if CompareFilenames(sSrc, sDst) = 0 then Exit; sSrc := GetAbsoluteFileName(FCurrentPath, sSrc); - sDst := GetAbsoluteFileName(FCurrentPath, sDst); + if not CheckBoxLnk.Checked then + sDst := GetAbsoluteFileName(FCurrentPath, sDst); - if CreateSymLink(sSrc, sDst) then + if CreateSymLink(sSrc, sDst, CheckBoxLnk.Checked ) then begin // write log if (log_cp_mv_ln in gLogOptions) and (log_success in gLogOptions) then @@ -91,4 +96,4 @@ edtLinkToCreate.SelectAll; end; -end. +end. Index: platform/uOSUtils.pas =================================================================== --- platform/uOSUtils.pas (revision 5790) +++ platform/uOSUtils.pas (working copy) @@ -97,7 +97,7 @@ @param(LinkName Name of symbolic link) @returns(The function returns @true if successful, @false otherwise) } -function CreateSymLink(const Path, LinkName: string) : Boolean; +function CreateSymLink(const Path, LinkName: string; bCreateLnk : boolean = false ) : Boolean; {en Read destination of symbolic link @param(LinkName Name of symbolic link) @@ -198,7 +198,7 @@ uFileProcs, FileUtil, uDCUtils, DCOSUtils, DCStrUtils, uGlobs, uLng {$IF DEFINED(MSWINDOWS)} , JwaWinCon, Windows, uNTFSLinks, uMyWindows, JwaWinNetWk, uShlObjAdditional - , shlobj + , shlobj, ActiveX, ComObj {$ENDIF} {$IF DEFINED(UNIX)} , BaseUnix, Unix, uMyUnix, dl @@ -517,16 +517,51 @@ end; {$ENDIF} -function CreateSymLink(const Path, LinkName: string) : Boolean; +function CreateSymLink(const Path, LinkName: string; bCreateLnk : boolean ) : Boolean; {$IFDEF MSWINDOWS} + procedure CreateShortCut(Target, ShortcutName: string); + var + IObject: IUnknown; + ISLink: IShellLink; + IPFile: IPersistFile; + PIDL: PItemIDList; + InFolder: array[0..MAX_PATH] of Char; + TargetName: String; + LinkName: WideString; + TargetArguments:string; + begin + TargetArguments:=''; + + { Creates an instance of IShellLink } + IObject := CreateComObject(CLSID_ShellLink); + ISLink := IObject as IShellLink; + IPFile := IObject as IPersistFile; + + ISLink.SetPath(pChar(UTF8ToSys(Target))); + ISLink.SetArguments(pChar(TargetArguments)); + ISLink.SetWorkingDirectory(pChar(ExtractFilePath(Target))); + + { Get the desktop location } + LinkName := UTF8Decode(ShortcutName); + if LowerCase(extractFileExt( LinkName )) <> '.lnk' then + LinkName := LinkName+'.lnk'; + + { Create the link } + IPFile.Save(PWChar(LinkName), false); + end; var wsPath, wsLinkName: WideString; begin Result := True; try - wsPath:= UTF8Decode(Path); - wsLinkName:= UTF8Decode(LinkName); - Result:= uNTFSLinks.CreateSymlink(wsPath, wsLinkName); + if bCreateLnk then + CreateShortCut( Path, LinkName ) + else + begin + wsPath:= UTF8Decode(Path); + wsLinkName:= UTF8Decode(LinkName); + Result:= uNTFSLinks.CreateSymlink(wsPath, wsLinkName); + end; except Result := False; end; | ||||
Fixed in Revision | 8525 | ||||
Operating system | |||||
Widgetset | |||||
Architecture | |||||
Date Modified | Username | Field | Change |
---|---|---|---|
2015-01-16 18:49 | holger | New Issue | |
2015-01-16 18:49 | holger | File Added: fsymlink.patch | |
2018-12-15 03:16 | mvitamin | Note Added: 0002975 | |
2018-12-16 16:00 | Alexx2000 | Assigned To | => Alexx2000 |
2018-12-16 16:00 | Alexx2000 | Status | new => assigned |
2018-12-16 16:02 | Alexx2000 | Fixed in Revision | => 8525 |
2018-12-16 16:02 | Alexx2000 | Status | assigned => resolved |
2018-12-16 16:02 | Alexx2000 | Resolution | open => fixed |
2018-12-16 16:02 | Alexx2000 | Fixed in Version | => 0.9.0 |
2018-12-16 16:02 | Alexx2000 | Target Version | => 0.9.0 |
2021-09-05 15:11 | Alexx2000 | Status | resolved => closed |