mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: Set date/time operation for FileSystemFileSource
This commit is contained in:
parent
a119ba353e
commit
0cc2e196a5
7 changed files with 176 additions and 8 deletions
|
|
@ -25,7 +25,7 @@ type
|
|||
end;
|
||||
|
||||
{en
|
||||
Operation that deletes files from an arbitrary file source.
|
||||
Operation that set attributes for files from an arbitrary file source.
|
||||
File source should match the class type.
|
||||
}
|
||||
TFileSourceSetAttributeOperation = class(TFileSourceOperation)
|
||||
|
|
|
|||
|
|
@ -9,8 +9,7 @@ uses
|
|||
uFileSourceOperation,
|
||||
uFileSourceOperationTypes,
|
||||
uFileSource,
|
||||
uFile,
|
||||
uOSUtils;
|
||||
uFile;
|
||||
|
||||
type
|
||||
|
||||
|
|
@ -91,6 +90,8 @@ begin
|
|||
aTargetFileSource := nil;
|
||||
FFilesToSetDateTime := theFilesToSetDateTime;
|
||||
theFilesToSetDateTime := nil;
|
||||
FCreationTime:= 0;
|
||||
FLastAccessTime:= 0;
|
||||
FLastWriteTime:= aLastWriteTime;
|
||||
FRecursive:= False;
|
||||
end;
|
||||
|
|
|
|||
|
|
@ -87,7 +87,8 @@ uses
|
|||
uFileSystemCreateDirectoryOperation,
|
||||
uFileSystemExecuteOperation,
|
||||
uFileSystemCalcChecksumOperation,
|
||||
uFileSystemCalcStatisticsOperation;
|
||||
uFileSystemCalcStatisticsOperation,
|
||||
uFileSystemSetDateTimeOperation;
|
||||
|
||||
constructor TFileSystemFileSource.Create;
|
||||
begin
|
||||
|
|
|
|||
|
|
@ -132,8 +132,8 @@ begin
|
|||
|
||||
if not Result then
|
||||
begin
|
||||
sMessage := Format(rsMsgLogError + 'Can not set attributes for "%s"', [FileName]);
|
||||
sQuestion := Format('Can not set attributes for "%s"', [FileName]);
|
||||
sMessage := Format(rsMsgLogError + rsMsgErrSetAttribute, [FileName]);
|
||||
sQuestion := Format(rsMsgErrSetAttribute, [FileName]);
|
||||
|
||||
if gSkipFileOpError or (FSkipErrors = True) then
|
||||
logWrite(Thread, sMessage, lmtError)
|
||||
|
|
|
|||
164
src/newdesign/ufilesystemsetdatetimeoperation.pas
Normal file
164
src/newdesign/ufilesystemsetdatetimeoperation.pas
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
unit uFileSystemSetDateTimeOperation;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils,
|
||||
uFileSourceSetDateTimeOperation,
|
||||
uFileSource,
|
||||
uFileSourceOperationOptions,
|
||||
uFileSourceOperationUI,
|
||||
uFile,
|
||||
uFileSystemFile,
|
||||
uGlobs, uLog, uOSUtils;
|
||||
|
||||
type
|
||||
|
||||
TFileSystemSetDateTimeOperation = class(TFileSourceSetDateTimeOperation)
|
||||
|
||||
private
|
||||
FFullFilesTreeToSetDateTime: TFileSystemFiles; // source files including all files/dirs in subdirectories
|
||||
FStatistics: TFileSourceSetDateTimeOperationStatistics; // local copy of statistics
|
||||
|
||||
// Options.
|
||||
FSymLinkOption: TFileSourceOperationOptionSymLink;
|
||||
FSkipErrors: Boolean;
|
||||
|
||||
protected
|
||||
function ProcessFile(aFile: TFileSystemFile): Boolean;
|
||||
|
||||
public
|
||||
constructor Create(aTargetFileSource: IFileSource;
|
||||
var theFilesToSetDateTime: TFiles; aLastWriteTime: TDateTime); override;
|
||||
|
||||
destructor Destroy; override;
|
||||
|
||||
procedure Initialize; override;
|
||||
procedure MainExecute; override;
|
||||
procedure Finalize; override;
|
||||
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
uLng, uFileSystemUtil;
|
||||
|
||||
constructor TFileSystemSetDateTimeOperation.Create(aTargetFileSource: IFileSource;
|
||||
var theFilesToSetDateTime: TFiles; aLastWriteTime: TDateTime);
|
||||
begin
|
||||
FSymLinkOption := fsooslNone;
|
||||
FSkipErrors := False;
|
||||
FFullFilesTreeToSetDateTime := nil;
|
||||
|
||||
inherited Create(aTargetFileSource, theFilesToSetDateTime, aLastWriteTime);
|
||||
end;
|
||||
|
||||
destructor TFileSystemSetDateTimeOperation.Destroy;
|
||||
begin
|
||||
inherited Destroy;
|
||||
|
||||
if Recursive then
|
||||
begin
|
||||
if Assigned(FFullFilesTreeToSetDateTime) then
|
||||
FreeAndNil(FFullFilesTreeToSetDateTime);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFileSystemSetDateTimeOperation.Initialize;
|
||||
begin
|
||||
// Get initialized statistics; then we change only what is needed.
|
||||
FStatistics := RetrieveStatistics;
|
||||
|
||||
if not Recursive then
|
||||
begin
|
||||
FFullFilesTreeToSetDateTime:= FilesToSetDateTime as TFileSystemFiles;
|
||||
FStatistics.TotalFiles:= FFullFilesTreeToSetDateTime.Count;
|
||||
end
|
||||
else
|
||||
begin
|
||||
FillAndCount(FilesToSetDateTime as TFileSystemFiles,
|
||||
FFullFilesTreeToSetDateTime,
|
||||
FStatistics.TotalFiles,
|
||||
FStatistics.TotalBytes); // gets full list of files (recursive)
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFileSystemSetDateTimeOperation.MainExecute;
|
||||
var
|
||||
aFile: TFileSystemFile;
|
||||
CurrentFileIndex: Integer;
|
||||
begin
|
||||
for CurrentFileIndex := FFullFilesTreeToSetDateTime.Count - 1 downto 0 do
|
||||
begin
|
||||
aFile := FFullFilesTreeToSetDateTime[CurrentFileIndex] as TFileSystemFile;
|
||||
|
||||
FStatistics.CurrentFile := aFile.Path + aFile.Name;
|
||||
UpdateStatistics(FStatistics);
|
||||
|
||||
ProcessFile(aFile);
|
||||
|
||||
with FStatistics do
|
||||
begin
|
||||
DoneFiles := DoneFiles + 1;
|
||||
DoneBytes := DoneBytes + aFile.Size;
|
||||
|
||||
UpdateStatistics(FStatistics);
|
||||
end;
|
||||
|
||||
CheckOperationState;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TFileSystemSetDateTimeOperation.Finalize;
|
||||
begin
|
||||
end;
|
||||
|
||||
function TFileSystemSetDateTimeOperation.ProcessFile(aFile: TFileSystemFile): Boolean;
|
||||
var
|
||||
FileName: String;
|
||||
bRetry: Boolean;
|
||||
sMessage, sQuestion: String;
|
||||
fdLastWriteTime,
|
||||
fdCreationTime,
|
||||
fdLastAccessTime: LongInt;
|
||||
begin
|
||||
Result := False;
|
||||
FileName := aFile.Path + aFile.Name;
|
||||
|
||||
fdLastWriteTime:= DateTimeToFileDate(LastWriteTime);
|
||||
fdCreationTime:= DateTimeToFileDate(CreationTime);
|
||||
fdLastAccessTime:= DateTimeToFileDate(LastAccessTime);
|
||||
|
||||
repeat
|
||||
bRetry := False;
|
||||
Result:= mbFileSetTime(FileName, fdLastWriteTime, fdCreationTime, fdLastAccessTime) <> 0;
|
||||
|
||||
if not Result then
|
||||
begin
|
||||
sMessage := Format(rsMsgLogError + rsMsgErrSetDateTime, [FileName]);
|
||||
sQuestion := Format(rsMsgErrSetDateTime, [FileName]);
|
||||
|
||||
if gSkipFileOpError or (FSkipErrors = True) then
|
||||
logWrite(Thread, sMessage, lmtError)
|
||||
else
|
||||
begin
|
||||
case AskQuestion(sQuestion, '',
|
||||
[fsourRetry, fsourSkip, fsourSkipAll, fsourAbort],
|
||||
fsourRetry, fsourSkip) of
|
||||
fsourRetry:
|
||||
bRetry := True;
|
||||
fsourSkipAll:
|
||||
FSkipErrors := True;
|
||||
fsourAbort:
|
||||
RaiseAbortOperation;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
until bRetry = False;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
@ -143,8 +143,8 @@ begin
|
|||
|
||||
if not Result then
|
||||
begin
|
||||
sMessage := Format(rsMsgLogError + 'Can not set attributes for "%s"', [FileName]);
|
||||
sQuestion := Format('Can not set attributes for "%s"', [FileName]);
|
||||
sMessage := Format(rsMsgLogError + rsMsgErrSetAttribute, [FileName]);
|
||||
sQuestion := Format(rsMsgErrSetAttribute, [FileName]);
|
||||
|
||||
if gSkipFileOpError or (FSkipErrors = True) then
|
||||
logWrite(Thread, sMessage, lmtError)
|
||||
|
|
|
|||
|
|
@ -83,6 +83,8 @@ resourcestring
|
|||
rsMsgPresetAlreadyExists = 'Preset "%s" already exists. Overwrite?';
|
||||
rsMsgMasterPassword = 'Master Password';
|
||||
rsMsgMasterPasswordEnter = 'Please enter the master password:';
|
||||
rsMsgErrSetAttribute = 'Can not set attributes for "%s"';
|
||||
rsMsgErrSetDateTime = 'Can not set date/time for "%s"';
|
||||
// for context menu
|
||||
rsMnuActions = 'Actions';
|
||||
rsMnuOpenWith = 'Open with ...';
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue