update for HEAD-2003050101
[reactos.git] / subsys / system / cmd / move.c
diff --git a/subsys/system/cmd/move.c b/subsys/system/cmd/move.c
new file mode 100644 (file)
index 0000000..fd3744f
--- /dev/null
@@ -0,0 +1,265 @@
+/*
+ *  MOVE.C - move internal command.
+ *
+ *
+ *  History:
+ *
+ *    14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Started.
+ *
+ *    18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Unicode safe!
+ *        Preliminary version!!!
+ *
+ *    20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Redirection safe!
+ *
+ *    27-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Added help text ("/?").
+ *        Added more error checks.
+ *
+ *    03-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
+ *        Added "/N" option.
+ */
+
+#include "config.h"
+
+#ifdef INCLUDE_CMD_MOVE
+
+#include <windows.h>
+#include <tchar.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "cmd.h"
+
+
+#define OVERWRITE_NO     0
+#define OVERWRITE_YES    1
+#define OVERWRITE_ALL    2
+#define OVERWRITE_CANCEL 3
+
+
+static INT Overwrite (LPTSTR fn)
+{
+       TCHAR inp[10];
+       LPTSTR p;
+
+       ConOutPrintf (_T("Overwrite %s (Yes/No/All)? "), fn);
+       ConInString (inp, 10);
+
+       _tcsupr (inp);
+       for (p=inp; _istspace (*p); p++)
+               ;
+
+       if (*p != _T('Y') && *p != _T('A'))
+               return OVERWRITE_NO;
+       if (*p == _T('A'))
+               return OVERWRITE_ALL;
+
+       return OVERWRITE_YES;
+}
+
+
+
+INT cmd_move (LPTSTR cmd, LPTSTR param)
+{
+       LPTSTR *arg;
+       INT argc, i, nFiles;
+       TCHAR szDestPath[MAX_PATH];
+       TCHAR szSrcPath[MAX_PATH];
+       BOOL bPrompt = TRUE;
+       LPTSTR p;
+       WIN32_FIND_DATA findBuffer;
+       HANDLE hFile;
+       LPTSTR pszFile;
+       BOOL   bNothing = FALSE;
+
+       if (!_tcsncmp (param, _T("/?"), 2))
+       {
+#if 0
+               ConOutPuts (_T("Moves files and renames files and directories.\n\n"
+                              "To move one or more files:\n"
+                              "MOVE [/N][/Y|/-Y][drive:][path]filename1[,...] destination\n"
+                              "\n"
+                              "To rename a directory:\n"
+                              "MOVE [/N][/Y|/-Y][drive:][path]dirname1 dirname2\n"
+                              "\n"
+                              "  [drive:][path]filename1  Specifies the location and name of the file\n"
+                              "                           or files you want to move.\n"
+                              "  /N                       Nothing. Don everthing but move files or direcories.\n"
+                              "  /Y\n"
+                              "  /-Y\n"
+                              "..."));
+#else
+               ConOutPuts (_T("Moves files and renames files and directories.\n\n"
+                              "To move one or more files:\n"
+                              "MOVE [/N][drive:][path]filename1[,...] destination\n"
+                              "\n"
+                              "To rename a directory:\n"
+                              "MOVE [/N][drive:][path]dirname1 dirname2\n"
+                              "\n"
+                              "  [drive:][path]filename1  Specifies the location and name of the file\n"
+                              "                           or files you want to move.\n"
+                              "  /N                       Nothing. Don everthing but move files or direcories.\n"
+                              "\n"
+                              "Current limitations:\n"
+                              "  - You can't move a file or directory from one drive to another.\n"
+                              ));
+#endif
+               return 0;
+       }
+
+       arg = split (param, &argc, FALSE);
+       nFiles = argc;
+
+       /* read options */
+       for (i = 0; i < argc; i++)
+       {
+               p = arg[i];
+
+               if (*p == _T('/'))
+               {
+                       p++;
+                       if (*p == _T('-'))
+                       {
+                               p++;
+                               if (_totupper (*p) == _T('Y'))
+                                       bPrompt = TRUE;
+                       }
+                       else
+                       {
+                               if (_totupper (*p) == _T('Y'))
+                                       bPrompt = FALSE;
+                               else if  (_totupper (*p) == _T('N'))
+                                       bNothing = TRUE;
+                       }
+                       nFiles--;
+               }
+       }
+
+       if (nFiles < 2)
+       {
+               /* there must be at least two pathspecs */
+               error_req_param_missing ();
+               return 1;
+       }
+
+       /* get destination */
+       GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL);
+#ifdef _DEBUG
+       DebugPrintf (_T("Destination: %s\n"), szDestPath);
+#endif
+
+       /* move it*/
+       for (i = 0; i < argc - 1; i++)
+       {
+               if (*arg[i] == _T('/'))
+                       continue;
+
+               hFile = FindFirstFile (arg[i], &findBuffer);
+               if (hFile == INVALID_HANDLE_VALUE)
+               {
+                       ErrorMessage (GetLastError (), arg[i]);
+                       freep (arg);
+                       return 1;
+               }
+
+               do
+               {
+                       GetFullPathName (findBuffer.cFileName, MAX_PATH, szSrcPath, &pszFile);
+
+                       if (GetFileAttributes (szSrcPath) & FILE_ATTRIBUTE_DIRECTORY)
+                       {
+                               /* source is directory */
+
+#ifdef _DEBUG
+                               DebugPrintf (_T("Move directory \'%s\' to \'%s\'\n"),
+                                                        szSrcPath, szDestPath);
+#endif
+                               if (!bNothing)
+                               {
+                                       MoveFile (szSrcPath, szDestPath);
+                               }
+                       }
+                       else
+                       {
+                               /* source is file */
+
+                               if (IsValidFileName (szDestPath))
+                               {
+                                       /* destination exists */
+                                       if (GetFileAttributes (szDestPath) & FILE_ATTRIBUTE_DIRECTORY)
+                                       {
+                                               /* destination is existing directory */
+
+                                               TCHAR szFullDestPath[MAX_PATH];
+
+                                               _tcscpy (szFullDestPath, szDestPath);
+                                               _tcscat (szFullDestPath, _T("\\"));
+                                               _tcscat (szFullDestPath, pszFile);
+
+                                               ConOutPrintf (_T("%s => %s"), szSrcPath, szFullDestPath);
+
+                                               if (!bNothing)
+                                               {
+                                                       if (MoveFile (szSrcPath, szFullDestPath))
+                                                               ConOutPrintf (_T("[OK]\n"));
+                                                       else
+                                                               ConOutPrintf (_T("[Error]\n"));
+                                               }
+                                       }
+                                       else
+                                       {
+                                               /* destination is existing file */
+                                               INT nOverwrite;
+
+                                               /* must get the overwrite code */
+                                               if ((nOverwrite = Overwrite (szDestPath)))
+                                               {
+#if 0
+                                                       if (nOverwrite == OVERWRITE_ALL)
+                                                               *lpFlags |= FLAG_OVERWRITE_ALL;
+#endif
+                                                       ConOutPrintf (_T("%s => %s"), szSrcPath, szDestPath);
+
+                                                       if (!bNothing)
+                                                       {
+                                                               if (MoveFile (szSrcPath, szDestPath))
+                                                                       ConOutPrintf (_T("[OK]\n"));
+                                                               else
+                                                                       ConOutPrintf (_T("[Error]\n"));
+                                                       }
+                                               }
+                                       }
+                               }
+                               else
+                               {
+                                       /* destination does not exist */
+                                       TCHAR szFullDestPath[MAX_PATH];
+
+                                       GetFullPathName (szDestPath, MAX_PATH, szFullDestPath, NULL);
+
+                                       ConOutPrintf (_T("%s => %s"), szSrcPath, szFullDestPath);
+
+                                       if (!bNothing)
+                                       {
+                                               if (MoveFile (szSrcPath, szFullDestPath))
+                                                       ConOutPrintf (_T("[OK]\n"));
+                                               else
+                                                       ConOutPrintf (_T("[Error]\n"));
+                                       }
+                               }
+                       }
+               }
+               while (FindNextFile (hFile, &findBuffer));
+
+               FindClose (hFile);
+       }
+
+       freep (arg);
+
+       return 0;
+}
+
+#endif /* INCLUDE_CMD_MOVE */