mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 07:53:07 +00:00
irc nick jjkola, Jyrki Jaakkola <jjkola@email.com> frist patch solv to move file from a vol to another, and move mulite file same time. (not tested in ros) it works in windows with ros cmd. The patch are not very clean , but it fix alot of bugs also in move.
svn path=/trunk/; revision=16695
This commit is contained in:
parent
7aad44a4f5
commit
6af5a6f78f
1 changed files with 402 additions and 115 deletions
|
@ -34,7 +34,6 @@
|
||||||
|
|
||||||
#ifdef INCLUDE_CMD_MOVE
|
#ifdef INCLUDE_CMD_MOVE
|
||||||
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
MOVE_NOTHING = 0x001, /* /N */
|
MOVE_NOTHING = 0x001, /* /N */
|
||||||
|
@ -42,6 +41,18 @@ enum
|
||||||
MOVE_OVER_NO = 0x004, /* /-Y */
|
MOVE_OVER_NO = 0x004, /* /-Y */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{ /* Move status flags */
|
||||||
|
MOVE_SOURCE_IS_DIR = 0x001,
|
||||||
|
MOVE_SOURCE_IS_FILE = 0x002,
|
||||||
|
MOVE_DEST_IS_DIR = 0x004,
|
||||||
|
MOVE_DEST_IS_FILE = 0x008,
|
||||||
|
MOVE_SOURCE_HAS_WILD = 0x010, /* source has wildcard */
|
||||||
|
MOVE_SRC_CURRENT_IS_DIR = 0x020, /* source is file but at the current round we found a directory */
|
||||||
|
MOVE_DEST_EXISTS = 0x040,
|
||||||
|
MOVE_PATHS_ON_DIF_VOL = 0x080 /* source and destination paths are on different volume */
|
||||||
|
};
|
||||||
|
|
||||||
static INT Overwrite (LPTSTR fn)
|
static INT Overwrite (LPTSTR fn)
|
||||||
{
|
{
|
||||||
/*ask the user if they want to override*/
|
/*ask the user if they want to override*/
|
||||||
|
@ -53,6 +64,26 @@ static INT Overwrite (LPTSTR fn)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetDirectory (LPTSTR wholepath, LPTSTR directory)
|
||||||
|
{
|
||||||
|
/* returns only directory part of path with backslash */
|
||||||
|
/* TODO: make code unc aware */
|
||||||
|
/* Is there a better alternative to this? */
|
||||||
|
LPTSTR last;
|
||||||
|
if (IsExistingDirectory(wholepath))
|
||||||
|
{
|
||||||
|
_tcscpy(directory, wholepath);
|
||||||
|
}
|
||||||
|
else if ((last = _tcsrchr(wholepath,_T('\\'))) != NULL)
|
||||||
|
{
|
||||||
|
_tcsncpy(directory, wholepath, last - wholepath + 1);
|
||||||
|
directory[last - wholepath + 1] = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetRootPath(wholepath,directory, MAX_PATH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
INT cmd_move (LPTSTR cmd, LPTSTR param)
|
INT cmd_move (LPTSTR cmd, LPTSTR param)
|
||||||
|
@ -61,12 +92,30 @@ INT cmd_move (LPTSTR cmd, LPTSTR param)
|
||||||
LPTSTR *arg;
|
LPTSTR *arg;
|
||||||
INT argc, i, nFiles;
|
INT argc, i, nFiles;
|
||||||
TCHAR szDestPath[MAX_PATH];
|
TCHAR szDestPath[MAX_PATH];
|
||||||
|
TCHAR szFullDestPath[MAX_PATH];
|
||||||
|
TCHAR szSrcDirPath[MAX_PATH];
|
||||||
TCHAR szSrcPath[MAX_PATH];
|
TCHAR szSrcPath[MAX_PATH];
|
||||||
|
TCHAR szFullSrcPath[MAX_PATH];
|
||||||
DWORD dwFlags = 0;
|
DWORD dwFlags = 0;
|
||||||
INT nOverwrite = 0;
|
INT nOverwrite = 0;
|
||||||
WIN32_FIND_DATA findBuffer;
|
WIN32_FIND_DATA findBuffer;
|
||||||
HANDLE hFile;
|
HANDLE hFile;
|
||||||
|
|
||||||
|
/* used only when source and destination directories are on different volume*/
|
||||||
|
HANDLE hDestFile;
|
||||||
|
WIN32_FIND_DATA findDestBuffer;
|
||||||
|
TCHAR szMoveDest[MAX_PATH];
|
||||||
|
TCHAR szMoveSrc[MAX_PATH];
|
||||||
|
LPTSTR pszDestDirPointer;
|
||||||
|
LPTSTR pszSrcDirPointer;
|
||||||
|
INT nDirLevel = 0;
|
||||||
|
|
||||||
LPTSTR pszFile;
|
LPTSTR pszFile;
|
||||||
|
BOOL OnlyOneFile;
|
||||||
|
BOOL FoundFile;
|
||||||
|
BOOL MoveStatus;
|
||||||
|
DWORD dwMoveFlags = 0;
|
||||||
|
DWORD dwMoveStatusFlags = 0;
|
||||||
|
|
||||||
|
|
||||||
if (!_tcsncmp (param, _T("/?"), 2))
|
if (!_tcsncmp (param, _T("/?"), 2))
|
||||||
|
@ -127,12 +176,18 @@ INT cmd_move (LPTSTR cmd, LPTSTR param)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_tcschr (arg[argc - 1], _T('*')) != NULL)
|
/* check for wildcards in source and destination */
|
||||||
|
if (_tcschr (arg[argc - 1], _T('*')) != NULL || _tcschr (arg[argc - 1], _T('?')) != NULL)
|
||||||
{
|
{
|
||||||
/*'*' in dest, this doesnt happen. give folder name instead*/
|
/* '*'/'?' in dest, this doesnt happen. give folder name instead*/
|
||||||
error_parameter_format('2');
|
error_invalid_parameter_format(arg[argc - 1]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (_tcschr (arg[argc - 2], _T('*')) != NULL || _tcschr (arg[argc - 2], _T('?')) != NULL)
|
||||||
|
{
|
||||||
|
dwMoveStatusFlags |= MOVE_SOURCE_HAS_WILD;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* get destination */
|
/* get destination */
|
||||||
GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL);
|
GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL);
|
||||||
|
@ -140,125 +195,357 @@ INT cmd_move (LPTSTR cmd, LPTSTR param)
|
||||||
DebugPrintf (_T("Destination: %s\n"), szDestPath);
|
DebugPrintf (_T("Destination: %s\n"), szDestPath);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* move it */
|
/* get source folder */
|
||||||
for (i = 0; i < argc - 1; i++)
|
GetDirectory(arg[argc - 2], szSrcDirPath);
|
||||||
{
|
GetFullPathName(szSrcDirPath, MAX_PATH, szSrcPath, &pszFile);
|
||||||
if (*arg[i] == _T('/'))
|
_tcscpy(szSrcDirPath,szSrcPath);
|
||||||
continue;
|
/* we need following check to see if source happens to be directly given directory
|
||||||
|
and if it is then rip off last directory part so that there won't be any clashes with codes after this point */
|
||||||
|
GetFullPathName(arg[argc - 2], MAX_PATH, szSrcPath, &pszFile);
|
||||||
|
if (_tcscmp(szSrcDirPath,szSrcPath) == 0)
|
||||||
|
szSrcDirPath[pszFile - szSrcPath] = _T('\0');
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("Source Folder: %s\n"), szSrcDirPath);
|
||||||
|
#endif
|
||||||
|
|
||||||
hFile = FindFirstFile (arg[i], &findBuffer);
|
hFile = FindFirstFile (arg[argc - 2], &findBuffer);
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
ErrorMessage (GetLastError (), arg[argc - 2]);
|
||||||
|
freep (arg);
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for special cases "." and ".." and if found skip them */
|
||||||
|
FoundFile = TRUE;
|
||||||
|
while(FoundFile &&
|
||||||
|
(_tcscmp(findBuffer.cFileName,_T(".")) == 0 ||
|
||||||
|
_tcscmp(findBuffer.cFileName,_T("..")) == 0))
|
||||||
|
FoundFile = FindNextFile (hFile, &findBuffer);
|
||||||
|
|
||||||
|
if (!FoundFile)
|
||||||
|
{
|
||||||
|
/* what? we don't have anything to move? */
|
||||||
|
error_file_not_found();
|
||||||
|
FindClose(hFile);
|
||||||
|
freep(arg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnlyOneFile = TRUE;
|
||||||
|
_tcscpy(szSrcPath,szSrcDirPath);
|
||||||
|
/*check to see if there is an ending slash, if not add one*/
|
||||||
|
if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
|
||||||
|
_tcscat (szSrcPath, _T("\\"));
|
||||||
|
_tcscat(szSrcPath,findBuffer.cFileName);
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("Source Path: %s\n"), szSrcPath);
|
||||||
|
#endif
|
||||||
|
/* check if there can be found files as files have first priority */
|
||||||
|
if (IsExistingFile(szSrcPath)) dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE;
|
||||||
|
else dwMoveStatusFlags |= MOVE_SOURCE_IS_DIR;
|
||||||
|
while(OnlyOneFile && FindNextFile(hFile,&findBuffer))
|
||||||
|
{
|
||||||
|
_tcscpy(szSrcPath,szSrcDirPath);
|
||||||
|
if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
|
||||||
|
_tcscat (szSrcPath, _T("\\"));
|
||||||
|
_tcscat(szSrcPath,findBuffer.cFileName);
|
||||||
|
if (IsExistingFile(szSrcPath))
|
||||||
{
|
{
|
||||||
ErrorMessage (GetLastError (), arg[i]);
|
ConOutPrintf(_T(""));
|
||||||
|
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) OnlyOneFile = FALSE;
|
||||||
|
else
|
||||||
|
{ /* this has been done this way so that we don't disturb other settings if they have been set before this */
|
||||||
|
dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE;
|
||||||
|
dwMoveStatusFlags &= ~MOVE_SOURCE_IS_DIR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FindClose(hFile);
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf(_T("Do we have only one file: %s\n"), OnlyOneFile ? _T("TRUE") : _T("FALSE"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* we have to start again to be sure we don't miss any files or folders*/
|
||||||
|
hFile = FindFirstFile (arg[argc - 2], &findBuffer);
|
||||||
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
ErrorMessage (GetLastError (), arg[argc - 2]);
|
||||||
|
freep (arg);
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for special cases "." and ".." and if found skip them */
|
||||||
|
FoundFile = TRUE;
|
||||||
|
while(FoundFile &&
|
||||||
|
(_tcscmp(findBuffer.cFileName,_T(".")) == 0 ||
|
||||||
|
_tcscmp(findBuffer.cFileName,_T("..")) == 0))
|
||||||
|
FoundFile = FindNextFile (hFile, &findBuffer);
|
||||||
|
|
||||||
|
if (!FoundFile)
|
||||||
|
{
|
||||||
|
/* huh? somebody removed files and/or folders which were there */
|
||||||
|
error_file_not_found();
|
||||||
|
FindClose(hFile);
|
||||||
|
freep(arg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if source and destination paths are on different volumes */
|
||||||
|
if (szSrcPath[0] != szDestPath[0])
|
||||||
|
dwMoveStatusFlags |= MOVE_PATHS_ON_DIF_VOL;
|
||||||
|
|
||||||
|
/* move it */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("Found file/directory: %s\n"), findBuffer.cFileName);
|
||||||
|
#endif
|
||||||
|
nOverwrite = 1;
|
||||||
|
dwMoveFlags = 0;
|
||||||
|
dwMoveStatusFlags &= ~MOVE_DEST_IS_FILE &
|
||||||
|
~MOVE_DEST_IS_DIR &
|
||||||
|
~MOVE_SRC_CURRENT_IS_DIR &
|
||||||
|
~MOVE_DEST_EXISTS;
|
||||||
|
_tcscpy(szFullSrcPath,szSrcDirPath);
|
||||||
|
if(szFullSrcPath[_tcslen(szFullSrcPath) - 1] != _T('\\'))
|
||||||
|
_tcscat (szFullSrcPath, _T("\\"));
|
||||||
|
_tcscat(szFullSrcPath,findBuffer.cFileName);
|
||||||
|
_tcscpy(szSrcPath, szFullSrcPath);
|
||||||
|
|
||||||
|
if (IsExistingDirectory(szSrcPath))
|
||||||
|
{
|
||||||
|
/* source is directory */
|
||||||
|
|
||||||
|
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE)
|
||||||
|
{
|
||||||
|
dwMoveStatusFlags |= MOVE_SRC_CURRENT_IS_DIR; /* source is file but at the current round we found a directory */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("Source is dir: %s\n"), szSrcPath);
|
||||||
|
#endif
|
||||||
|
dwMoveFlags = MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if source is file we don't need to do anything special */
|
||||||
|
|
||||||
|
if (IsExistingDirectory(szDestPath))
|
||||||
|
{
|
||||||
|
/* destination is existing directory */
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("Destination is directory: %s\n"), szDestPath);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dwMoveStatusFlags |= MOVE_DEST_IS_DIR;
|
||||||
|
|
||||||
|
/*build the dest string(accounts for *)*/
|
||||||
|
_tcscpy (szFullDestPath, szDestPath);
|
||||||
|
/*check to see if there is an ending slash, if not add one*/
|
||||||
|
if(szFullDestPath[_tcslen(szFullDestPath) - 1] != _T('\\'))
|
||||||
|
_tcscat (szFullDestPath, _T("\\"));
|
||||||
|
_tcscat (szFullDestPath, findBuffer.cFileName);
|
||||||
|
|
||||||
|
if (IsExistingFile(szFullDestPath) || IsExistingDirectory(szFullDestPath))
|
||||||
|
dwMoveStatusFlags |= MOVE_DEST_EXISTS;
|
||||||
|
|
||||||
|
dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
|
||||||
|
|
||||||
|
}
|
||||||
|
if (IsExistingFile(szDestPath))
|
||||||
|
{
|
||||||
|
/* destination is a file */
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf (_T("Destination is file: %s\n"), szDestPath);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dwMoveStatusFlags |= MOVE_DEST_IS_FILE | MOVE_DEST_EXISTS;
|
||||||
|
_tcscpy (szFullDestPath, szDestPath);
|
||||||
|
|
||||||
|
dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
DebugPrintf(_T("Move Status Flags: 0x%X\n"),dwMoveStatusFlags);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR &&
|
||||||
|
dwMoveStatusFlags & MOVE_DEST_IS_DIR &&
|
||||||
|
dwMoveStatusFlags & MOVE_SOURCE_HAS_WILD)
|
||||||
|
{
|
||||||
|
/* We are not allowed to have existing source and destination dir when there is wildcard in source */
|
||||||
|
error_syntax(NULL);
|
||||||
|
FindClose(hFile);
|
||||||
|
freep(arg);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(dwMoveStatusFlags & (MOVE_DEST_IS_FILE | MOVE_DEST_IS_DIR)))
|
||||||
|
{
|
||||||
|
/* destination doesn't exist */
|
||||||
|
_tcscpy (szFullDestPath, szDestPath);
|
||||||
|
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) dwMoveStatusFlags |= MOVE_DEST_IS_FILE;
|
||||||
|
if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) dwMoveStatusFlags |= MOVE_DEST_IS_DIR;
|
||||||
|
|
||||||
|
dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE &&
|
||||||
|
dwMoveStatusFlags & MOVE_DEST_IS_FILE &&
|
||||||
|
!OnlyOneFile)
|
||||||
|
{
|
||||||
|
/*source has many files but there is only one destination file*/
|
||||||
|
error_invalid_parameter_format(arg[argc - 1]);
|
||||||
|
FindClose(hFile);
|
||||||
freep (arg);
|
freep (arg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
do
|
/*checks to make sure user wanted/wants the override*/
|
||||||
{
|
if((dwFlags & MOVE_OVER_NO) &&
|
||||||
|
(dwMoveStatusFlags & MOVE_DEST_EXISTS))
|
||||||
|
continue;
|
||||||
|
if(!(dwFlags & MOVE_OVER_YES) &&
|
||||||
|
(dwMoveStatusFlags & MOVE_DEST_EXISTS))
|
||||||
|
nOverwrite = Overwrite (szFullDestPath);
|
||||||
|
if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
|
||||||
|
continue;
|
||||||
|
if (nOverwrite == PROMPT_ALL)
|
||||||
|
dwFlags |= MOVE_OVER_YES;
|
||||||
|
|
||||||
nOverwrite = 1;
|
|
||||||
GetFullPathName (findBuffer.cFileName, MAX_PATH, szSrcPath, &pszFile);
|
|
||||||
|
|
||||||
if (GetFileAttributes (szSrcPath) & FILE_ATTRIBUTE_DIRECTORY)
|
ConOutPrintf (_T("%s => %s "), szSrcPath, szFullDestPath);
|
||||||
|
|
||||||
|
/* are we really supposed to do something */
|
||||||
|
if (dwFlags & MOVE_NOTHING)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*move the file*/
|
||||||
|
if (!(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR &&
|
||||||
|
dwMoveStatusFlags & MOVE_PATHS_ON_DIF_VOL))
|
||||||
|
/* we aren't moving source folder to different drive */
|
||||||
|
MoveStatus = MoveFileEx (szSrcPath, szFullDestPath, dwMoveFlags);
|
||||||
|
else
|
||||||
|
{ /* we are moving source folder to different drive */
|
||||||
|
_tcscpy(szMoveDest, szFullDestPath);
|
||||||
|
_tcscpy(szMoveSrc, szSrcPath);
|
||||||
|
DeleteFile(szMoveDest);
|
||||||
|
MoveStatus = CreateDirectory(szMoveDest, NULL); /* we use default security settings */
|
||||||
|
if (MoveStatus)
|
||||||
{
|
{
|
||||||
/* source is directory */
|
_tcscat(szMoveDest,_T("\\"));
|
||||||
|
_tcscat(szMoveSrc,_T("\\"));
|
||||||
#ifdef _DEBUG
|
nDirLevel = 0;
|
||||||
DebugPrintf (_T("Move directory \'%s\' to \'%s\'\n"),
|
pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
|
||||||
szSrcPath, szDestPath);
|
pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
|
||||||
#endif
|
_tcscpy(pszSrcDirPointer,_T("*.*"));
|
||||||
if (!(dwFlags & MOVE_NOTHING))
|
hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
|
||||||
continue;
|
if (hDestFile == INVALID_HANDLE_VALUE)
|
||||||
MoveFileEx (szSrcPath, szDestPath, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED);
|
MoveStatus = FALSE;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* source is file */
|
|
||||||
if (GetFileAttributes (szDestPath) & FILE_ATTRIBUTE_DIRECTORY)
|
|
||||||
{
|
|
||||||
/* destination is existing directory */
|
|
||||||
|
|
||||||
/*build the dest string(accounts for *)*/
|
|
||||||
TCHAR szFullDestPath[MAX_PATH];
|
|
||||||
_tcscpy (szFullDestPath, szDestPath);
|
|
||||||
/*check to see if there is an ending slash, if not add one*/
|
|
||||||
if(szFullDestPath[_tcslen(szFullDestPath) - 1] != _T('\\'))
|
|
||||||
_tcscat (szFullDestPath, _T("\\"));
|
|
||||||
|
|
||||||
_tcscat (szFullDestPath, findBuffer.cFileName);
|
|
||||||
|
|
||||||
/*checks to make sure user wanted/wants the override*/
|
|
||||||
if((dwFlags & MOVE_OVER_NO) && IsExistingFile (szFullDestPath))
|
|
||||||
continue;
|
|
||||||
if(!(dwFlags & MOVE_OVER_YES) && IsExistingFile (szFullDestPath))
|
|
||||||
nOverwrite = Overwrite (szFullDestPath);
|
|
||||||
if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
|
|
||||||
continue;
|
|
||||||
if (nOverwrite == PROMPT_ALL)
|
|
||||||
dwFlags |= MOVE_OVER_YES;
|
|
||||||
|
|
||||||
/*delete the file that might be there first*/
|
|
||||||
DeleteFile(szFullDestPath);
|
|
||||||
ConOutPrintf (_T("%s => %s"), szSrcPath, szFullDestPath);
|
|
||||||
|
|
||||||
if ((dwFlags & MOVE_NOTHING))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*delete the file that might be there first*/
|
|
||||||
DeleteFile(szFullDestPath);
|
|
||||||
/*move the file*/
|
|
||||||
if (MoveFileEx (szSrcPath, szFullDestPath, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED))
|
|
||||||
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
|
|
||||||
else
|
|
||||||
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE);
|
|
||||||
|
|
||||||
ConOutPrintf(szMsg);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* destination is a file */
|
BOOL FirstTime = TRUE;
|
||||||
|
FoundFile = TRUE;
|
||||||
if (_tcschr (arg[argc - 2], _T('*')) != NULL)
|
MoveStatus = FALSE;
|
||||||
|
while(FoundFile)
|
||||||
{
|
{
|
||||||
/*'*' in src but there should't be one in the dest*/
|
if (FirstTime)
|
||||||
error_parameter_format('1');
|
FirstTime = FALSE;
|
||||||
return 1;
|
else
|
||||||
|
FoundFile = FindNextFile (hDestFile, &findDestBuffer);
|
||||||
|
|
||||||
|
if (!FoundFile)
|
||||||
|
{ /* Nothing to do in this folder so we stop working on it */
|
||||||
|
FindClose(hDestFile);
|
||||||
|
(pszSrcDirPointer)--;
|
||||||
|
(pszDestDirPointer)--;
|
||||||
|
_tcscpy(pszSrcDirPointer,_T(""));
|
||||||
|
if (nDirLevel > 0)
|
||||||
|
{
|
||||||
|
TCHAR szTempPath[MAX_PATH];
|
||||||
|
INT nDiff;
|
||||||
|
|
||||||
|
FoundFile = TRUE; /* we need to continue our seek for files */
|
||||||
|
nDirLevel--;
|
||||||
|
RemoveDirectory(szMoveSrc);
|
||||||
|
GetDirectory(szMoveSrc,szTempPath);
|
||||||
|
nDiff = _tcslen(szMoveSrc) - _tcslen(szTempPath);
|
||||||
|
pszSrcDirPointer = pszSrcDirPointer - nDiff;
|
||||||
|
_tcscpy(pszSrcDirPointer,_T(""));
|
||||||
|
pszDestDirPointer = pszDestDirPointer - nDiff;
|
||||||
|
_tcscpy(pszDestDirPointer,_T(""));
|
||||||
|
if(szMoveSrc[_tcslen(szMoveSrc) - 1] != _T('\\'))
|
||||||
|
_tcscat (szMoveSrc, _T("\\"));
|
||||||
|
if(szMoveDest[_tcslen(szMoveDest) - 1] != _T('\\'))
|
||||||
|
_tcscat (szMoveDest, _T("\\"));
|
||||||
|
pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
|
||||||
|
pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
|
||||||
|
_tcscpy(pszSrcDirPointer,_T("*.*"));
|
||||||
|
_tcscpy(pszDestDirPointer,_T("*.*"));
|
||||||
|
hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
|
||||||
|
if (hDestFile == INVALID_HANDLE_VALUE)
|
||||||
|
continue;
|
||||||
|
FirstTime = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MoveStatus = TRUE; /* we moved everything so lets tell user about it */
|
||||||
|
RemoveDirectory(szMoveSrc);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if we find "." or ".." we'll skip them */
|
||||||
|
if (_tcscmp(findDestBuffer.cFileName,_T(".")) == 0 ||
|
||||||
|
_tcscmp(findDestBuffer.cFileName,_T("..")) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_tcscpy(pszSrcDirPointer, findDestBuffer.cFileName);
|
||||||
|
_tcscpy(pszDestDirPointer, findDestBuffer.cFileName);
|
||||||
|
if (IsExistingFile(szMoveSrc))
|
||||||
|
{
|
||||||
|
FoundFile = CopyFile(szMoveSrc, szMoveDest, FALSE);
|
||||||
|
if (!FoundFile) continue;
|
||||||
|
DeleteFile(szMoveSrc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FindClose(hDestFile);
|
||||||
|
CreateDirectory(szMoveDest, NULL);
|
||||||
|
_tcscat(szMoveDest,_T("\\"));
|
||||||
|
_tcscat(szMoveSrc,_T("\\"));
|
||||||
|
nDirLevel++;
|
||||||
|
pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
|
||||||
|
pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
|
||||||
|
_tcscpy(pszSrcDirPointer,_T("*.*"));
|
||||||
|
_tcscpy(pszDestDirPointer,_T("*.*"));
|
||||||
|
hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
|
||||||
|
if (hDestFile == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
FoundFile = FALSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
FirstTime = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*bunch of checks to see if we the user wanted/wants
|
|
||||||
to really override the files*/
|
|
||||||
if((dwFlags & MOVE_OVER_NO) && IsExistingFile (szDestPath))
|
|
||||||
continue;
|
|
||||||
if(!(dwFlags & MOVE_OVER_YES) && IsExistingFile (szDestPath))
|
|
||||||
nOverwrite = Overwrite (szDestPath);
|
|
||||||
if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
|
|
||||||
continue;
|
|
||||||
if (nOverwrite == PROMPT_ALL)
|
|
||||||
dwFlags |= MOVE_OVER_YES;
|
|
||||||
|
|
||||||
ConOutPrintf (_T("%s => %s"), szSrcPath, szDestPath);
|
|
||||||
|
|
||||||
if ((dwFlags & MOVE_NOTHING))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*delete the file first just to get ride of it
|
|
||||||
if it was already there*/
|
|
||||||
DeleteFile(szDestPath);
|
|
||||||
/*do the moving*/
|
|
||||||
if (MoveFileEx (szSrcPath, szDestPath, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED))
|
|
||||||
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
|
|
||||||
else
|
|
||||||
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE);
|
|
||||||
|
|
||||||
ConOutPrintf(szMsg);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (FindNextFile (hFile, &findBuffer));
|
if (MoveStatus)
|
||||||
FindClose (hFile);
|
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
|
||||||
|
else
|
||||||
|
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE);
|
||||||
|
|
||||||
|
ConOutPrintf(szMsg);
|
||||||
}
|
}
|
||||||
|
while ((!OnlyOneFile || dwMoveStatusFlags & MOVE_SRC_CURRENT_IS_DIR ) &&
|
||||||
|
!(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) &&
|
||||||
|
FindNextFile (hFile, &findBuffer));
|
||||||
|
FindClose (hFile);
|
||||||
|
|
||||||
freep (arg);
|
freep (arg);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue