[CMD]
authorPierre Schweitzer <pierre@reactos.org>
Tue, 25 Aug 2015 20:35:51 +0000 (20:35 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Tue, 25 Aug 2015 20:35:51 +0000 (20:35 +0000)
Implement switch /R for dir command.
It allows enumerating alternate data streams of files

Commit dedicated to Ged

svn path=/trunk/; revision=68823

21 files changed:
reactos/base/shell/cmd/dir.c
reactos/base/shell/cmd/lang/cs-CZ.rc
reactos/base/shell/cmd/lang/de-DE.rc
reactos/base/shell/cmd/lang/el-GR.rc
reactos/base/shell/cmd/lang/en-US.rc
reactos/base/shell/cmd/lang/es-ES.rc
reactos/base/shell/cmd/lang/fr-FR.rc
reactos/base/shell/cmd/lang/hu-HU.rc
reactos/base/shell/cmd/lang/id-ID.rc
reactos/base/shell/cmd/lang/it-IT.rc
reactos/base/shell/cmd/lang/ja-JP.rc
reactos/base/shell/cmd/lang/no-NO.rc
reactos/base/shell/cmd/lang/pl-PL.rc
reactos/base/shell/cmd/lang/ro-RO.rc
reactos/base/shell/cmd/lang/ru-RU.rc
reactos/base/shell/cmd/lang/sk-SK.rc
reactos/base/shell/cmd/lang/sq-AL.rc
reactos/base/shell/cmd/lang/sv-SE.rc
reactos/base/shell/cmd/lang/tr-TR.rc
reactos/base/shell/cmd/lang/uk-UA.rc
reactos/base/shell/cmd/lang/zh-CN.rc

index 1745ec0..c78ad8c 100644 (file)
  *        Removed variables formerly in use to handle pagination
  *        Pagination belongs to ConOutPrintfPaging
  *        Removed already commented out code of old pagination
+ *
+ *    25-Aug-2015 (Pierre Schweitzer)
+ *        Implemented /R switch
  */
 
 #include "precomp.h"
@@ -172,6 +175,7 @@ typedef struct _DirSwitchesFlags
     BOOL bRecursive;    /* Displays files in specified directory and all sub */
     BOOL bShortName;    /* Displays the sort name of files if exist */
     BOOL b4Digit;       /* Four digit year */
+    BOOL bDataStreams;  /* Displays alternate data streams */
     struct
     {
         DWORD dwAttribVal;  /* The desired state of attribute */
@@ -189,9 +193,21 @@ typedef struct _DirSwitchesFlags
     } stTimeField;                  /* The time field to display or use for sorting */
 } DIRSWITCHFLAGS, *LPDIRSWITCHFLAGS;
 
-typedef struct _DIRFINDLISTNODE
+typedef struct _DIRFINDSTREAMNODE
+{
+    WIN32_FIND_STREAM_DATA stStreamInfo;
+    struct _DIRFINDSTREAMNODE *ptrNext;
+} DIRFINDSTREAMNODE, *PDIRFINDSTREAMNODE;
+
+typedef struct _DIRFINDINFO
 {
     WIN32_FIND_DATA stFindInfo;
+    PDIRFINDSTREAMNODE ptrHead;
+} DIRFINDINFO, *PDIRFINDINFO;
+
+typedef struct _DIRFINDLISTNODE
+{
+    DIRFINDINFO stInfo;
     struct _DIRFINDLISTNODE *ptrNext;
 } DIRFINDLISTNODE, *PDIRFINDLISTNODE;
 
@@ -325,6 +341,8 @@ DirReadParam(LPTSTR Line,               /* [IN] The line with the parameters & s
                 lpFlags->bRecursive = ! bNegative;
             else if (cCurUChar == _T('X'))
                 lpFlags->bShortName = ! bNegative;
+            else if (cCurChar == _T('R'))
+                lpFlags->bDataStreams = ! bNegative;
             else if (cCurChar == _T('4'))
                 lpFlags->b4Digit = ! bNegative;
             else if (cCurChar == _T('?'))
@@ -838,7 +856,7 @@ getName(const TCHAR* file, TCHAR * dest)
  * The function that prints in new style
  */
 static VOID
-DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN]Files' Info */
+DirPrintNewList(PDIRFINDINFO ptrFiles[],        /* [IN]Files' Info */
                 DWORD dwCount,                  /* [IN] The quantity of files */
                 TCHAR *szCurPath,               /* [IN] Full path of current directory */
                 LPDIRSWITCHFLAGS lpFlags)       /* [IN] The flags used */
@@ -850,17 +868,18 @@ DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN]Files' Info */
     TCHAR szTime[20];
     INT iSizeFormat;
     ULARGE_INTEGER u64FileSize;
+    PDIRFINDSTREAMNODE ptrCurStream;
 
     for (i = 0; i < dwCount && !bCtrlBreak; i++)
     {
         /* Calculate size */
-        if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+        if (ptrFiles[i]->stFindInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
         {
             /* Junction */
             iSizeFormat = -14;
             _tcscpy(szSize, _T("<JUNCTION>"));
         }
-        else if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+        else if (ptrFiles[i]->stFindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
         {
             /* Directory */
             iSizeFormat = -14;
@@ -870,18 +889,18 @@ DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN]Files' Info */
         {
             /* File */
             iSizeFormat = 14;
-            u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh;
-            u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow;
+            u64FileSize.HighPart = ptrFiles[i]->stFindInfo.nFileSizeHigh;
+            u64FileSize.LowPart = ptrFiles[i]->stFindInfo.nFileSizeLow;
             ConvertULargeInteger(u64FileSize.QuadPart, szSize, 20, lpFlags->bTSeperator);
         }
 
         /* Calculate short name */
         szShortName[0] = _T('\0');
         if (lpFlags->bShortName)
-            _stprintf(szShortName, _T(" %-12s"), ptrFiles[i]->cAlternateFileName);
+            _stprintf(szShortName, _T(" %-12s"), ptrFiles[i]->stFindInfo.cAlternateFileName);
 
         /* Format date and time */
-        DirPrintFileDateTime(szDate, szTime, ptrFiles[i], lpFlags);
+        DirPrintFileDateTime(szDate, szTime, &ptrFiles[i]->stFindInfo, lpFlags);
 
         /* Print the line */
         DirPrintf(lpFlags, _T("%10s  %-6s    %*s%s %s\n"),
@@ -890,7 +909,25 @@ DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN]Files' Info */
                   iSizeFormat,
                   szSize,
                   szShortName,
-                  ptrFiles[i]->cFileName);
+                  ptrFiles[i]->stFindInfo.cFileName);
+
+        /* Now, loop on the streams */
+        ptrCurStream = ptrFiles[i]->ptrHead;
+        while (ptrCurStream)
+        {
+            ConvertULargeInteger(ptrCurStream->stStreamInfo.StreamSize.QuadPart, szSize, 20, lpFlags->bTSeperator);
+
+            /* Print the line */
+            DirPrintf(lpFlags, _T("%10s  %-6s    %*s%s %s%s\n"),
+                      L"",
+                      L"",
+                      16,
+                      szSize,
+                      L"",
+                      ptrFiles[i]->stFindInfo.cFileName,
+                      ptrCurStream->stStreamInfo.cStreamName);
+            ptrCurStream = ptrCurStream->ptrNext;
+        }
     }
 }
 
@@ -901,7 +938,7 @@ DirPrintNewList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN]Files' Info */
  * The function that prints in wide list
  */
 static VOID
-DirPrintWideList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
+DirPrintWideList(PDIRFINDINFO ptrFiles[],       /* [IN] Files' Info */
                  DWORD dwCount,                 /* [IN] The quantity of files */
                  TCHAR *szCurPath,              /* [IN] Full path of current directory */
                  LPDIRSWITCHFLAGS lpFlags)      /* [IN] The flags used */
@@ -919,16 +956,16 @@ DirPrintWideList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
     iLongestName = 1;
     for (i = 0; i < dwCount; i++)
     {
-        if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+        if (ptrFiles[i]->stFindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
         {
             /* Directories need 2 additinal characters for brackets */
-            if ((_tcslen(ptrFiles[i]->cFileName) + 2) > iLongestName)
-                iLongestName = _tcslen(ptrFiles[i]->cFileName) + 2;
+            if ((_tcslen(ptrFiles[i]->stFindInfo.cFileName) + 2) > iLongestName)
+                iLongestName = _tcslen(ptrFiles[i]->stFindInfo.cFileName) + 2;
         }
         else
         {
-            if (_tcslen(ptrFiles[i]->cFileName) > iLongestName)
-                iLongestName = _tcslen(ptrFiles[i]->cFileName);
+            if (_tcslen(ptrFiles[i]->stFindInfo.cFileName) > iLongestName)
+                iLongestName = _tcslen(ptrFiles[i]->stFindInfo.cFileName);
         }
     }
 
@@ -963,10 +1000,10 @@ DirPrintWideList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
 
             if (temp >= dwCount) break;
 
-            if (ptrFiles[temp]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
-                _stprintf(szTempFname, _T("[%s]"), ptrFiles[temp]->cFileName);
+            if (ptrFiles[temp]->stFindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+                _stprintf(szTempFname, _T("[%s]"), ptrFiles[temp]->stFindInfo.cFileName);
             else
-                _stprintf(szTempFname, _T("%s"), ptrFiles[temp]->cFileName);
+                _stprintf(szTempFname, _T("%s"), ptrFiles[temp]->stFindInfo.cFileName);
 
             DirPrintf(lpFlags, _T("%-*s"), iLongestName + 1, szTempFname);
         }
@@ -983,7 +1020,7 @@ DirPrintWideList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
  * The function that prints in old style
  */
 static VOID
-DirPrintOldList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN] Files' Info */
+DirPrintOldList(PDIRFINDINFO ptrFiles[],        /* [IN] Files' Info */
                 DWORD dwCount,                  /* [IN] The quantity of files */
                 TCHAR * szCurPath,              /* [IN] Full path of current directory */
                 LPDIRSWITCHFLAGS lpFlags)       /* [IN] The flags used */
@@ -999,21 +1036,21 @@ DirPrintOldList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN] Files' Info */
     for (i = 0; i < dwCount && !bCtrlBreak; i++)
     {
         /* Broke 8.3 format */
-        if (*ptrFiles[i]->cAlternateFileName )
+        if (*ptrFiles[i]->stFindInfo.cAlternateFileName )
         {
             /* If the file is long named then we read the alter name */
-            getName( ptrFiles[i]->cAlternateFileName, szName);
-            _tcscpy(szExt, getExt( ptrFiles[i]->cAlternateFileName));
+            getName( ptrFiles[i]->stFindInfo.cAlternateFileName, szName);
+            _tcscpy(szExt, getExt( ptrFiles[i]->stFindInfo.cAlternateFileName));
         }
         else
         {
             /* If the file is not long name we read its original name */
-            getName( ptrFiles[i]->cFileName, szName);
-            _tcscpy(szExt, getExt( ptrFiles[i]->cFileName));
+            getName( ptrFiles[i]->stFindInfo.cFileName, szName);
+            _tcscpy(szExt, getExt( ptrFiles[i]->stFindInfo.cFileName));
         }
 
         /* Calculate size */
-        if (ptrFiles[i]->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+        if (ptrFiles[i]->stFindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
         {
             /* Directory, no size it's a directory*/
             iSizeFormat = -17;
@@ -1023,13 +1060,13 @@ DirPrintOldList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN] Files' Info */
         {
             /* File */
             iSizeFormat = 17;
-            u64FileSize.HighPart = ptrFiles[i]->nFileSizeHigh;
-            u64FileSize.LowPart = ptrFiles[i]->nFileSizeLow;
+            u64FileSize.HighPart = ptrFiles[i]->stFindInfo.nFileSizeHigh;
+            u64FileSize.LowPart = ptrFiles[i]->stFindInfo.nFileSizeLow;
             ConvertULargeInteger(u64FileSize.QuadPart, szSize, 20, lpFlags->bTSeperator);
         }
 
         /* Format date and time */
-        DirPrintFileDateTime(szDate,szTime,ptrFiles[i],lpFlags);
+        DirPrintFileDateTime(szDate,szTime,&ptrFiles[i]->stFindInfo,lpFlags);
 
         /* Print the line */
         DirPrintf(lpFlags, _T("%-8s %-3s  %*s %s  %s\n"),
@@ -1048,7 +1085,7 @@ DirPrintOldList(LPWIN32_FIND_DATA ptrFiles[],   /* [IN] Files' Info */
  * The function that prints in bare format
  */
 static VOID
-DirPrintBareList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
+DirPrintBareList(PDIRFINDINFO ptrFiles[],       /* [IN] Files' Info */
                  DWORD dwCount,                 /* [IN] The number of files */
                  LPTSTR lpCurPath,              /* [IN] Full path of current directory */
                  LPDIRSWITCHFLAGS lpFlags)      /* [IN] The flags used */
@@ -1057,8 +1094,8 @@ DirPrintBareList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
 
     for (i = 0; i < dwCount && !bCtrlBreak; i++)
     {
-        if ((_tcscmp(ptrFiles[i]->cFileName, _T(".")) == 0) ||
-            (_tcscmp(ptrFiles[i]->cFileName, _T("..")) == 0))
+        if ((_tcscmp(ptrFiles[i]->stFindInfo.cFileName, _T(".")) == 0) ||
+            (_tcscmp(ptrFiles[i]->stFindInfo.cFileName, _T("..")) == 0))
         {
             /* at bare format we don't print "." and ".." folder */
             continue;
@@ -1066,12 +1103,12 @@ DirPrintBareList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
         if (lpFlags->bRecursive)
         {
             /* at recursive mode we print full path of file */
-            DirPrintf(lpFlags, _T("%s\\%s\n"), lpCurPath, ptrFiles[i]->cFileName);
+            DirPrintf(lpFlags, _T("%s\\%s\n"), lpCurPath, ptrFiles[i]->stFindInfo.cFileName);
         }
         else
         {
             /* if we are not in recursive mode we print the file names */
-            DirPrintf(lpFlags, _T("%s\n"), ptrFiles[i]->cFileName);
+            DirPrintf(lpFlags, _T("%s\n"), ptrFiles[i]->stFindInfo.cFileName);
         }
     }
 }
@@ -1083,7 +1120,7 @@ DirPrintBareList(LPWIN32_FIND_DATA ptrFiles[],  /* [IN] Files' Info */
  * The functions that prints the files list
  */
 static VOID
-DirPrintFiles(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */
+DirPrintFiles(PDIRFINDINFO ptrFiles[],      /* [IN] Files' Info */
               DWORD dwCount,                /* [IN] The quantity of files */
               TCHAR *szCurPath,             /* [IN] Full path of current directory */
               LPDIRSWITCHFLAGS lpFlags)     /* [IN] The flags used */
@@ -1139,8 +1176,8 @@ DirPrintFiles(LPWIN32_FIND_DATA ptrFiles[], /* [IN] Files' Info */
  * Compares 2 files based on the order criteria
  */
 static BOOL
-CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of file 1 */
-             LPWIN32_FIND_DATA lpFile2, /* [IN] A pointer to WIN32_FIND_DATA of file 2 */
+CompareFiles(PDIRFINDINFO lpFile1,      /* [IN] A pointer to WIN32_FIND_DATA of file 1 */
+             PDIRFINDINFO lpFile2,      /* [IN] A pointer to WIN32_FIND_DATA of file 2 */
              LPDIRSWITCHFLAGS lpFlags)  /* [IN] The flags that we use to list */
 {
   ULARGE_INTEGER u64File1;
@@ -1157,10 +1194,10 @@ CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of
         {
         case ORDER_SIZE:        /* Order by size /o:s */
             /* concat the 32bit integers to a 64bit */
-            u64File1.LowPart = lpFile1->nFileSizeLow;
-            u64File1.HighPart = lpFile1->nFileSizeHigh;
-            u64File2.LowPart = lpFile2->nFileSizeLow;
-            u64File2.HighPart = lpFile2->nFileSizeHigh;
+            u64File1.LowPart = lpFile1->stFindInfo.nFileSizeLow;
+            u64File1.HighPart = lpFile1->stFindInfo.nFileSizeHigh;
+            u64File2.LowPart = lpFile2->stFindInfo.nFileSizeLow;
+            u64File2.HighPart = lpFile2->stFindInfo.nFileSizeHigh;
 
             /* In case that differnce is too big for a long */
             if (u64File1.QuadPart < u64File2.QuadPart)
@@ -1172,16 +1209,16 @@ CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of
             break;
 
         case ORDER_DIRECTORY:   /* Order by directory attribute /o:g */
-            iComp = ((lpFile2->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)-
-                (lpFile1->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY));
+            iComp = ((lpFile2->stFindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)-
+                (lpFile1->stFindInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY));
             break;
 
         case ORDER_EXTENSION:   /* Order by extension name /o:e */
-            iComp = _tcsicmp(getExt(lpFile1->cFileName),getExt(lpFile2->cFileName));
+            iComp = _tcsicmp(getExt(lpFile1->stFindInfo.cFileName),getExt(lpFile2->stFindInfo.cFileName));
             break;
 
         case ORDER_NAME:        /* Order by filename /o:n */
-            iComp = _tcsicmp(lpFile1->cFileName, lpFile2->cFileName);
+            iComp = _tcsicmp(lpFile1->stFindInfo.cFileName, lpFile2->stFindInfo.cFileName);
             break;
 
         case ORDER_TIME:        /* Order by file's time /o:t */
@@ -1190,24 +1227,24 @@ CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of
             {
             case TF_CREATIONDATE:
                 /* concat the 32bit integers to a 64bit */
-                u64File1.LowPart = lpFile1->ftCreationTime.dwLowDateTime;
-                u64File1.HighPart = lpFile1->ftCreationTime.dwHighDateTime ;
-                u64File2.LowPart = lpFile2->ftCreationTime.dwLowDateTime;
-                u64File2.HighPart = lpFile2->ftCreationTime.dwHighDateTime ;
+                u64File1.LowPart = lpFile1->stFindInfo.ftCreationTime.dwLowDateTime;
+                u64File1.HighPart = lpFile1->stFindInfo.ftCreationTime.dwHighDateTime ;
+                u64File2.LowPart = lpFile2->stFindInfo.ftCreationTime.dwLowDateTime;
+                u64File2.HighPart = lpFile2->stFindInfo.ftCreationTime.dwHighDateTime ;
                 break;
             case TF_LASTACCESSEDDATE :
                 /* concat the 32bit integers to a 64bit */
-                u64File1.LowPart = lpFile1->ftLastAccessTime.dwLowDateTime;
-                u64File1.HighPart = lpFile1->ftLastAccessTime.dwHighDateTime ;
-                u64File2.LowPart = lpFile2->ftLastAccessTime.dwLowDateTime;
-                u64File2.HighPart = lpFile2->ftLastAccessTime.dwHighDateTime ;
+                u64File1.LowPart = lpFile1->stFindInfo.ftLastAccessTime.dwLowDateTime;
+                u64File1.HighPart = lpFile1->stFindInfo.ftLastAccessTime.dwHighDateTime ;
+                u64File2.LowPart = lpFile2->stFindInfo.ftLastAccessTime.dwLowDateTime;
+                u64File2.HighPart = lpFile2->stFindInfo.ftLastAccessTime.dwHighDateTime ;
                 break;
             case TF_MODIFIEDDATE:
                 /* concat the 32bit integers to a 64bit */
-                u64File1.LowPart = lpFile1->ftLastWriteTime.dwLowDateTime;
-                u64File1.HighPart = lpFile1->ftLastWriteTime.dwHighDateTime ;
-                u64File2.LowPart = lpFile2->ftLastWriteTime.dwLowDateTime;
-                u64File2.HighPart = lpFile2->ftLastWriteTime.dwHighDateTime ;
+                u64File1.LowPart = lpFile1->stFindInfo.ftLastWriteTime.dwLowDateTime;
+                u64File1.HighPart = lpFile1->stFindInfo.ftLastWriteTime.dwHighDateTime ;
+                u64File2.LowPart = lpFile2->stFindInfo.ftLastWriteTime.dwLowDateTime;
+                u64File2.HighPart = lpFile2->stFindInfo.ftLastWriteTime.dwHighDateTime ;
                 break;
             }
 
@@ -1240,12 +1277,12 @@ CompareFiles(LPWIN32_FIND_DATA lpFile1, /* [IN] A pointer to WIN32_FIND_DATA of
  * Sort files by the order criterias using quicksort method
  */
 static VOID
-QsortFiles(LPWIN32_FIND_DATA ptrArray[],    /* [IN/OUT] The array with file info pointers */
+QsortFiles(PDIRFINDINFO ptrArray[],         /* [IN/OUT] The array with file info pointers */
            int i,                           /* [IN]     The index of first item in array */
            int j,                           /* [IN]     The index to last item in array */
            LPDIRSWITCHFLAGS lpFlags)        /* [IN]     The flags that we will use to sort */
 {
-    LPWIN32_FIND_DATA lpTemp;   /* A temporary pointer */
+    PDIRFINDINFO lpTemp;   /* A temporary pointer */
     BOOL Way;
 
     if (i < j)
@@ -1289,8 +1326,9 @@ DirList(LPTSTR szPath,              /* [IN] The path that dir starts */
     BOOL fPoint;                        /* If szPath is a file with extension fPoint will be True*/
     HANDLE hSearch;                     /* The handle of the search */
     HANDLE hRecSearch;                  /* The handle for searching recursivly */
+    HANDLE hStreams;                    /* The handle for alternate streams */
     WIN32_FIND_DATA wfdFileInfo;        /* The info of file that found */
-    LPWIN32_FIND_DATA * ptrFileArray;   /* An array of pointers with all the files */
+    PDIRFINDINFO * ptrFileArray;        /* An array of pointers with all the files */
     PDIRFINDLISTNODE ptrStartNode;      /* The pointer to the first node */
     PDIRFINDLISTNODE ptrNextNode;       /* A pointer used for relatives refernces */
     TCHAR szFullPath[MAX_PATH];         /* The full path that we are listing with trailing \ */
@@ -1301,6 +1339,9 @@ DirList(LPTSTR szPath,              /* [IN] The path that dir starts */
     DWORD dwCountDirs;                  /* Counter for directories */
     ULONGLONG u64CountBytes;            /* Counter for bytes */
     ULARGE_INTEGER u64Temp;             /* A temporary counter */
+    WIN32_FIND_STREAM_DATA wfsdStreamInfo;
+    PDIRFINDSTREAMNODE * ptrCurNode;    /* The pointer to the first stream */
+    PDIRFINDSTREAMNODE ptrFreeNode;     /* The pointer used during cleanup */
 
     /* Initialize Variables */
     ptrStartNode = NULL;
@@ -1363,6 +1404,12 @@ DirList(LPTSTR szPath,              /* [IN] The path that dir starts */
                     while (ptrStartNode)
                     {
                         ptrNextNode = ptrStartNode->ptrNext;
+                        while (ptrStartNode->stInfo.ptrHead)
+                        {
+                            ptrFreeNode = ptrStartNode->stInfo.ptrHead;
+                            ptrStartNode->stInfo.ptrHead = ptrFreeNode->ptrNext;
+                            cmd_free(ptrFreeNode);
+                        }
                         cmd_free(ptrStartNode);
                         ptrStartNode = ptrNextNode;
                         dwCount--;
@@ -1376,15 +1423,68 @@ DirList(LPTSTR szPath,              /* [IN] The path that dir starts */
                 if (ptrNextNode->ptrNext)
                 {
                     /* Copy the info of search at linked list */
-                    memcpy(&ptrNextNode->ptrNext->stFindInfo,
+                    memcpy(&ptrNextNode->ptrNext->stInfo.stFindInfo,
                            &wfdFileInfo,
                            sizeof(WIN32_FIND_DATA));
 
                     /* If lower case is selected do it here */
                     if (lpFlags->bLowerCase)
                     {
-                        _tcslwr(ptrNextNode->ptrNext->stFindInfo.cAlternateFileName);
-                        _tcslwr(ptrNextNode->ptrNext->stFindInfo.cFileName);
+                        _tcslwr(ptrNextNode->ptrNext->stInfo.stFindInfo.cAlternateFileName);
+                        _tcslwr(ptrNextNode->ptrNext->stInfo.stFindInfo.cFileName);
+                    }
+
+                    /* No streams (yet?) */
+                    ptrNextNode->ptrNext->stInfo.ptrHead = NULL;
+
+                    /* Alternate streams are only displayed with new long list */
+                    if (lpFlags->bNewLongList && lpFlags->bDataStreams)
+                    {
+                        /* Try to get stream information */
+                        hStreams = FindFirstStreamW(wfdFileInfo.cFileName, FindStreamInfoStandard, &wfsdStreamInfo, 0);
+                        if (hStreams != INVALID_HANDLE_VALUE)
+                        {
+                            /* We totally ignore first stream. It contains data about ::$DATA */
+                            ptrCurNode = &ptrNextNode->ptrNext->stInfo.ptrHead;
+                            while (FindNextStreamW(hStreams, &wfsdStreamInfo))
+                            {
+                                *ptrCurNode = cmd_alloc(sizeof(DIRFINDSTREAMNODE));
+                                if (*ptrCurNode == NULL)
+                                {
+                                    WARN("DEBUG: Cannot allocate memory for *ptrCurNode!\n");
+                                    while (ptrStartNode)
+                                    {
+                                        ptrNextNode = ptrStartNode->ptrNext;
+                                        while (ptrStartNode->stInfo.ptrHead)
+                                        {
+                                            ptrFreeNode = ptrStartNode->stInfo.ptrHead;
+                                            ptrStartNode->stInfo.ptrHead = ptrFreeNode->ptrNext;
+                                            cmd_free(ptrFreeNode);
+                                        }
+                                        cmd_free(ptrStartNode);
+                                        ptrStartNode = ptrNextNode;
+                                        dwCount--;
+                                    }
+                                    FindClose(hStreams);
+                                    FindClose(hSearch);
+                                    return 1;
+                                }
+
+                                memcpy(&(*ptrCurNode)->stStreamInfo, &wfsdStreamInfo,
+                                       sizeof(WIN32_FIND_STREAM_DATA));
+
+                                /* If lower case is selected do it here */
+                                if (lpFlags->bLowerCase)
+                                {
+                                    _tcslwr((*ptrCurNode)->stStreamInfo.cStreamName);
+                                }
+
+                                ptrCurNode = &(*ptrCurNode)->ptrNext;
+                            }
+
+                             FindClose(hStreams);
+                             *ptrCurNode = NULL;
+                        }
                     }
 
                     /* Continue at next node at linked list */
@@ -1415,13 +1515,19 @@ DirList(LPTSTR szPath,              /* [IN] The path that dir starts */
     ptrNextNode->ptrNext = NULL;
 
     /* Calculate and allocate space need for making an array of pointers */
-    ptrFileArray = cmd_alloc(sizeof(LPWIN32_FIND_DATA) * dwCount);
+    ptrFileArray = cmd_alloc(sizeof(PDIRFINDINFO) * dwCount);
     if (ptrFileArray == NULL)
     {
         WARN("DEBUG: Cannot allocate memory for ptrFileArray!\n");
         while (ptrStartNode)
         {
             ptrNextNode = ptrStartNode->ptrNext;
+            while (ptrStartNode->stInfo.ptrHead)
+            {
+                ptrFreeNode = ptrStartNode->stInfo.ptrHead;
+                ptrStartNode->stInfo.ptrHead = ptrFreeNode->ptrNext;
+                cmd_free(ptrFreeNode);
+            }
             cmd_free(ptrStartNode);
             ptrStartNode = ptrNextNode;
             dwCount --;
@@ -1437,7 +1543,7 @@ DirList(LPTSTR szPath,              /* [IN] The path that dir starts */
     dwCount = 0;
     while (ptrNextNode->ptrNext)
     {
-        *(ptrFileArray + dwCount) = &ptrNextNode->ptrNext->stFindInfo;
+        *(ptrFileArray + dwCount) = &ptrNextNode->ptrNext->stInfo;
         ptrNextNode = ptrNextNode->ptrNext;
         dwCount++;
     }
@@ -1467,6 +1573,12 @@ DirList(LPTSTR szPath,              /* [IN] The path that dir starts */
     while (ptrStartNode)
     {
         ptrNextNode = ptrStartNode->ptrNext;
+        while (ptrStartNode->stInfo.ptrHead)
+        {
+            ptrFreeNode = ptrStartNode->stInfo.ptrHead;
+            ptrStartNode->stInfo.ptrHead = ptrFreeNode->ptrNext;
+            cmd_free(ptrFreeNode);
+        }
         cmd_free(ptrStartNode);
         ptrStartNode = ptrNextNode;
         dwCount --;
@@ -1543,6 +1655,7 @@ CommandDir(LPTSTR rest)
     /* Initialize Switch Flags < Default switches are setted here!> */
     stFlags.b4Digit = TRUE;
     stFlags.bBareFormat = FALSE;
+    stFlags.bDataStreams = FALSE;
     stFlags.bLowerCase = FALSE;
     stFlags.bNewLongList = TRUE;
     stFlags.bPause = FALSE;
@@ -1620,6 +1733,7 @@ CommandDir(LPTSTR rest)
                 TRACE(" Order Criteria [%i]: %i (Reversed: %i)\n",i, stFlags.stOrderBy.eCriteria[i], stFlags.stOrderBy.bCriteriaRev[i] );
             TRACE("(P) Pause : %i\n", stFlags.bPause  );
             TRACE("(Q) Owner : %i\n", stFlags.bUser );
+            TRACE("(R) Data stream : %i\n", stFlags.bDataStreams );
             TRACE("(S) Recursive : %i\n", stFlags.bRecursive );
             TRACE("(T) Time field : %i\n", stFlags.stTimeField.eTimeField );
             TRACE("(X) Short names : %i\n", stFlags.bShortName );
index dd989d7..9ff59e8 100644 (file)
@@ -148,7 +148,7 @@ DELAY [/m]n\n\n\
   /m          specifiy than n are milliseconds\n\
               otherwise n are seconds\n"
     STRING_DIR_HELP1 "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
   [drive:][path][filename]\n\
               Specifies drive, directory, and/or files to list.\n\n\
   /A          Displays files with specified attributes.\n\
@@ -167,6 +167,7 @@ DELAY [/m]n\n\n\
                G  Group directories first    -  Prefix to reverse order\n\
   /P          Pauses after each screenful of information.\n\
   /Q          Display the owner of the file.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Displays files in specified directory and all subdirectories.\n\
   /T          Controls which time field displayed or used for sorting\n\
   timefield   C  Creation\n\
index a84326a..8346136 100644 (file)
@@ -142,7 +142,7 @@ DELAY [/m]n\n\n\
   /m          Millisekunden, ansonsten Sekunden\n"
     STRING_DIR_HELP1 "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\
 DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]Attribute]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]Reihenfolge]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+  [/O[[:]Reihenfolge]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
   [Laufwerk:][path][Dateiname]\n\
               Bezeichnet Laufwerk, Verzeichnis und/oder Dateien.\n\n\
   /A          Listet Dateien mit angegebenen Attributen auf.\n\
@@ -162,6 +162,7 @@ DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]Attribute]] [/B] [/C] [/D] [/L] [/N]\n\
                G  Verzeichnisse zuerst        - vorangestellt kehrt die\n\
   /P          Pausiert nach jeder vollen Bildschirmseite.\n\
   /Q          Gibt den Besitzer der Datei aus.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Listet Dateien und alle Unterverzeichnisse auf.\n\
   /T          Bestimmt welche Zeit verwendet wird.\n\
   timefield   C  Erstellung\n\
index ea97509..8438f78 100644 (file)
@@ -147,7 +147,7 @@ DELAY [/m]n\n\n\
   /m          specifiy than n are milliseconds\n\
               otherwise n are seconds\n"
     STRING_DIR_HELP1 "DIR [δίσκος:][μονοπάτι][αρχείο] [/A[[:]χαρακτηριστικά]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
   [δίσκος:][μονοπάτι][αρχείο]\n\
               Καθορίζει μονάδα δίσκου, κατάλογο ή/και αρχεία που θα παρατεθούν σε λίστα.\n\n\
   /A          Εμφανίζει αρχεία με τα καθορισμένα χαρακτηριστικά..\n\
@@ -166,6 +166,7 @@ DELAY [/m]n\n\n\
                      G  Πρώτα οι κατάλογοι ομάδων    -  Πρόθεμα για αντιστροφή της σειράς\n\
   /P          Σταματάει όταν οι πληροφορίες γεμίσουν μία οθόνη.\n\
   /Q          Εμφάνιση του ιδιοκτήτη του αρχείου.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Εμφανίζει τα αρχεία στον καθορισμένο κατάλογο και σε όλους τους υποκαταλόγους.\n\
   /T          Ελέγχει ποιο πεδίο χρόνου θα εμφανιστεί ή θα χρησιμοποιηθεί για την ταξινόμηση\n\
   πεδίο χρόνου   C  Δημιουργία\n\
index 219cb7e..5edf46a 100644 (file)
@@ -143,7 +143,7 @@ DELAY [/m]n\n\n\
   /m          specifiy than n are milliseconds\n\
               otherwise n are seconds\n"
     STRING_DIR_HELP1 "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
   [drive:][path][filename]\n\
               Specifies drive, directory, and/or files to list.\n\n\
   /A          Displays files with specified attributes.\n\
@@ -162,6 +162,7 @@ DELAY [/m]n\n\n\
                G  Group directories first    -  Prefix to reverse order\n\
   /P          Pauses after each screenful of information.\n\
   /Q          Display the owner of the file.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Displays files in specified directory and all subdirectories.\n\
   /T          Controls which time field displayed or used for sorting\n\
   timefield   C  Creation\n\
index 86e48e1..d5aa371 100644 (file)
@@ -145,7 +145,7 @@ DELAY [/m]n\n\n\
   /m          Especifica que n son milisegundos\n\
               En otro caso n son segundos\n"
     STRING_DIR_HELP1 "DIR [unidad:][ruta][nombre de archivo] [/A[[:]atributos]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]orden]] [/P] [/Q] [/S] [/T[[:]fecha]] [/W] [/X] [/4]\n\n\
+  [/O[[:]orden]] [/P] [/Q] [/R] [/S] [/T[[:]fecha]] [/W] [/X] [/4]\n\n\
   [unidad:][ruta][nombre de archivo]\n\
               Especifica la unidad, el directorio o los archivos a listar.\n\n\
   /A          Muestra los archivos con los atributos especificados.\n\
@@ -165,6 +165,7 @@ DELAY [/m]n\n\n\
                G  Los directorios primero       -  Prefijo para el orden inverso\n\
   /P          Pausa después de cada pantalla llena de información.\n\
   /Q          Muestra el propietario del archivo.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Muestra los archivos en el directorio especificado y sus subdirectorios.\n\
   /T          Controla que campo de tiempo se muestra o es usado para ordenar:\n\
   campo de tiempo  C  Creación\n\
index aaea0c8..fea0529 100644 (file)
@@ -151,7 +151,7 @@ DELAY [/m]n\n\n\
   /m          spécifie que n est en millisecondes\n\
               sinon n est en secondes"
     STRING_DIR_HELP1 "DIR [lecteur:][chemin][fichier] [/A[[:]attributs]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]ordredetri]] [/P] [/Q] [/S] [/T[[:]heure]] [/W] [/X] [/4]\n\n\
+  [/O[[:]ordredetri]] [/P] [/Q] [/R] [/S] [/T[[:]heure]] [/W] [/X] [/4]\n\n\
   [lecteur:][chemin][fichier]\n\
          Spécifie le disque, le répertoire, et/ou les fichiers à lister.\n\n\
   /A          Affiche les fichiers avec les attributs indiqués.\n\
@@ -173,6 +173,7 @@ DELAY [/m]n\n\n\
                G  Répertoires d'abord    -  Préfixe pour inverser l'ordre\n\
   /P          S'arrête après chaque page d'information.\n\
   /Q          Affiche le propriétaire du fichier.\n\
+  /R          Affiche les flux de données alternatifs du fichier.\n\
   /S          Affiche les fichiers dans le répertoire indiqué et\n\
               tous les sous-répertoires.\n\
   /T          Contrôle quel champ de temps sera affiché ou utilisé\n\
index a9f2478..29e7fa9 100644 (file)
@@ -136,7 +136,7 @@ DELAY [/m]n\n\n\
   /m          specifiy than n are milliseconds\n\
               otherwise n are seconds\n"
     STRING_DIR_HELP1 "DIR [meghajtó:][elérési_út][állománynév] [/A[[:]attribútumok]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]rendezési_feltétel]] [/P] [/Q] [/S] [/T[[:]idõ]] [/W] [/X] [/4]\n\n\
+  [/O[[:]rendezési_feltétel]] [/P] [/Q] [/R] [/S] [/T[[:]idõ]] [/W] [/X] [/4]\n\n\
   [meghajtó:][elérési_út][állományname]\n\
               Az adott hely állományait és mappáit jeleníti meg.\n\n\
   /A          A megadott attribútumu állományokat jeleníti csak meg.\n\
@@ -154,6 +154,7 @@ DELAY [/m]n\n\n\
                G  Mappák legelõl                      -  ""Nem"" prefixel fordított rendezés\n\
   /P          Csak egy képernyõnyi adat megjelenítése egyszerre.\n\
   /Q          Állomány tulajdonsosának megjelenítése.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Almappák tartalmát is megjeleníti.\n\
   /T          Controls which time field displayed or used for sorting\n\
   timefield   C  Létrehozás\n\
index 6bc9f16..caa4cf5 100644 (file)
@@ -145,7 +145,7 @@ DELAY [/m]n\n\n\
   /m          menetapkan bahwa n adalah milidetik\n\
               sebaliknya n adalah detik\n"
     STRING_DIR_HELP1 "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
   [drive:][path][filename]\n\
               Menetapkan drive, direktori, dan/atau files ke daftar.\n\n\
   /A          Menampilkan file dengan atribut yang ditetapkan.\n\
@@ -164,6 +164,7 @@ DELAY [/m]n\n\n\
                G  Grup direktori pertama     -  Prefiks untuk membalik urutan\n\
   /P          Menunda setelah setiap layar penuh informasi.\n\
   /Q          Menampilkan pemilik file.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Menampilkan file dalam direktori dan semua subdirektorinya.\n\
   /T          Mengontrol field waktu mana atau dipakai untuk mengurut\n\
   timefield   C  Pembuatan\n\
index 01a1423..615ec79 100644 (file)
@@ -143,7 +143,7 @@ DELAY [/m]n\n\n\
   /m          precisa che n è in millisecondi\n\
               altrimenti n è in secondi\n"
     STRING_DIR_HELP1 "DIR [disco:][percorso][nomefilen] [/A[[:]attributi]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]orderinamento]] [/P] [/Q] [/S] [/T[[:]tempo]] [/W] [/X] [/4]\n\n\
+  [/O[[:]orderinamento]] [/P] [/Q] [/R] [/S] [/T[[:]tempo]] [/W] [/X] [/4]\n\n\
   [disco:][percorso][nomefilen]\n\
               Indica disco, percorso e/o file da elencare.\n\n\
   /A          Visualizza i file con gli attributi indicati.\n\
@@ -162,6 +162,7 @@ DELAY [/m]n\n\n\
                G  Le cartelle per prime    -  Prefisso per invertire l'ordine\n\
   /P          Pasa dopo ogni schermata piena.\n\
   /Q          Visualizza il proprietario del file.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Visualizza i file nella cartella indicata e nelle sottocartelle.\n\
   /T          Sceglie quale campo di tempo è usato per gli ordinamenti.\n\
   timefield   C  Creazione\n\
index c23d9a5..80c282b 100644 (file)
@@ -148,7 +148,7 @@ DELAY [/m]n\n\n\
               指定しない場合、単位には秒が使われます。\n"
     STRING_DIR_HELP1 "ディレクトリ中のファイルとサブディレクトリを一覧表示します。\n\n\
 DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]ソート順]] [/P] [/Q] [/S] [/T[[:]タイムフィールド]] [/W] [/X] [/4]\n\n\
+  [/O[[:]ソート順]] [/P] [/Q] [/R] [/S] [/T[[:]タイムフィールド]] [/W] [/X] [/4]\n\n\
   [ドライブ:][パス][ファイル名]\n\
               一覧表示するドライブ、ディレクトリ、またはファイルを指定します。\n\
   /A          指定された属性のファイルを表示します。\n\
@@ -167,6 +167,7 @@ DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L]
                G  グループ (ディレクトリから) -  降順\n\
   /P          1 画面ごとに停止して表示します。\n\
   /Q          ファイルの所有者を表示します。\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          指定されたディレクトリおよびそのサブディレクトリのすべての\n\
               ファイルを表示します。\n\
   /T          どのタイムフィールドを表示するか、または並べ替えに使用するかを\n\
index ea13ce5..0a588a1 100644 (file)
@@ -143,7 +143,7 @@ DELAY [/m]n\n\n\
   /m          spesifiserer at n er mikrosekunder\n\
               ellers er n sekunder\n"
     STRING_DIR_HELP1 "DIR [stasjon:][mappe][filnavn] [/A[[:]attributter]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]sortering]] [/P] [/Q] [/S] [/T[[:]tidsfelt]] [/W] [/X] [/4]\n\n\
+  [/O[[:]sortering]] [/P] [/Q] [/R] [/S] [/T[[:]tidsfelt]] [/W] [/X] [/4]\n\n\
   [stasjon:][mappe][filnavn]\n\
               Spesifisere stasjon, mappe, og/eller filer som skal listes.\n\n\
   /A          Vis filer ved å spesifisere attributter.\n\
@@ -162,6 +162,7 @@ DELAY [/m]n\n\n\
                G  Gruppere mapper først    -  Prefiks for å reversere orden\n\
   /P          Pause etter hvert hele skjermbilde.\n\
   /Q          Viser hvem som eier filen.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Viser alle filer i angitt mappe og alle undermapper.\n\
   /T          Styrer hvilket tidsfelt som vises eller blir brukt for sortering\n\
   timefelt    C  Opprettet \n\
index 4101f0a..2a40881 100644 (file)
@@ -151,7 +151,7 @@ DELAY [/m]n\n\n\
   /m          wymusza traktowanie n jako milisekund,\n\
               w innym wypadku będzie traktowane jako sekundy\n"
     STRING_DIR_HELP1 "DIR [napęd:][ścieżka][pliki] [/A[[:]atrybuty]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]porządek]] [/P] [/Q] [/S] [/T[[:]czas]] [/W] [/X] [/4]\n\n\
+  [/O[[:]porządek]] [/P] [/Q] [/R] [/S] [/T[[:]czas]] [/W] [/X] [/4]\n\n\
   [napęd:][ścieżka][nazwa_pliku]\n\
               Wyznacza literę napędu, katalog, i/lub pliki do wyświetlenia.\n\n\
   /A          Wyświetla pliki o określonych atrybutach.\n\
@@ -170,6 +170,7 @@ DELAY [/m]n\n\n\
                G  Wyświetla najpierw katalogi      -  Odwraca kolejność\n\
   /P          Pauza po każdym pełnym ekranie.\n\
   /Q          Wyświetla właściciela plików\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Wyświetla pliki w danym katalogu i wszystkich podkatalogach.\n\
   /T          Pole czasu, odpowiedzialne za wyświetlanie/sortowanie \n\
   czas        C  Utworzenia\n\
index 6b7a7fd..4929a52 100644 (file)
@@ -160,7 +160,7 @@ DELAY [/m]n\n\n\
   /m          Specifică faptul că «n» sunt milisecunde\n\
               altfel «n» sunt considerate secunde.\n"
     STRING_DIR_HELP1 "DIR [unitate:][cale][fișier] [/A[[:]atribute]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]ordonare]] [/P] [/Q] [/S] [/T[[:]timp]] [/W] [/X] [/4]\n\n\
+  [/O[[:]ordonare]] [/P] [/Q] [/R] [/S] [/T[[:]timp]] [/W] [/X] [/4]\n\n\
   [unitate:][cale][fișier]\n\
               Specifică unitatea, directorul și/sau fișierele de enumerat.\n\n\
   /A          Afișează fișierele după atributele specificate.\n\
@@ -182,6 +182,7 @@ DELAY [/m]n\n\n\
                 -  Prefix pentru inversarea ordinii\n\
   /P          Pauză după un ecran de informații.\n\
   /Q          Afișează posesorul fișierului.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Afișează fișierele din directorul specificat și\n\
               din toate subdirectoarele sale.\n\
   /T          Determină care timp este afișat sau folosit la ordonare\n\
index 17a567f..ea4364a 100644 (file)
@@ -146,7 +146,7 @@ DELAY [/m]n\n\n\
   /m          указывает, что n означает количество миллисекунд\n\
               иначе n означает количество секунд\n"
     STRING_DIR_HELP1 "DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]сортировка]] [/P] [/Q] [/S] [/T[[:]время]] [/W] [/X] [/4]\n\n\
+  [/O[[:]сортировка]] [/P] [/Q] [/R] [/S] [/T[[:]время]] [/W] [/X] [/4]\n\n\
   [диск:][путь][имя_файла]\n\
               Диск, каталог и/или файлы, которые следует включить в список.\n\n\
   /A          Вывод файлов с указанными атрибутами.\n\
@@ -165,6 +165,7 @@ DELAY [/m]n\n\n\
                G  Начать список с каталогов   Префикс ""-"" обращает порядок\n\
   /P          Пауза после заполнения каждого экрана.\n\
   /Q          Вывод сведений о владельце файла.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Вывод списка файлов из указанного каталога и его подкаталогов.\n\
   /T          Выбор поля времени для отображения и сортировки\n\
   время       C  Создание\n\
index 85ada8c..e47c133 100644 (file)
@@ -149,7 +149,7 @@ DELAY [/m]n\n\n\
   /m          specifiy than n are milliseconds\n\
               otherwise n are seconds\n"
     STRING_DIR_HELP1 "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
+  [/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
   [drive:][path][filename]\n\
               Specifies drive, directory, and/or files to list.\n\n\
   /A          Displays files with specified attributes.\n\
@@ -168,6 +168,7 @@ DELAY [/m]n\n\n\
                G  Group directories first    -  Prefix to reverse order\n\
   /P          Pauses after each screenful of information.\n\
   /Q          Display the owner of the file.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Displays files in specified directory and all subdirectories.\n\
   /T          Controls which time field displayed or used for sorting\n\
   timefield   C  Creation\n\
index deb956d..2e1815e 100644 (file)
@@ -147,7 +147,7 @@ DELAY [/m]n\n\n\
   /m          specifikoni se n janë millisekonda\n\
               ndryshe n janë sekonda\n"
     STRING_DIR_HELP1 "DIR [drive:][rrugë][emer] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]radhitje]] [/P] [/Q] [/S] [/T[[:]koha]] [/W] [/X] [/4]\n\n\
+  [/O[[:]radhitje]] [/P] [/Q] [/R] [/S] [/T[[:]koha]] [/W] [/X] [/4]\n\n\
   [drive:][rrugë][emer]\n\
               Përcakton, Drejtorin, dhe / ose dokumentin në listë.\n\n\
   /A          Shfaq dokumentat me atributet e specifikuara.\n\
@@ -166,6 +166,7 @@ DELAY [/m]n\n\n\
                G  Grupi skedave se pari      -  Parashtese të kthejë renditjen\n\
   /P          Pauzo pas çdo informacioni në ekran.\n\
   /Q          Shfaq zotëruesin e dosjes.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Shfaq dokumentet në skedën e specifikuar dhe të gjitha nën-skedat.\n\
   /T          Kontrollon secilen fushë kohohore e shfaqura ose e përdorur për klasifikimin\n\
   timefield   C  Krijim\n\
index 92aa461..13e9902 100644 (file)
@@ -143,7 +143,7 @@ DELAY [/m]n\n\n\
   /m          anger at n är mikrosekunder\n\
               annars är n sekunder\n"
     STRING_DIR_HELP1 "DIR [enhet:][mapp][filnamn] [/A[[:]attribut]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]sortering]] [/P] [/Q] [/S] [/T[[:]tidsfält]] [/W] [/X] [/4]\n\n\
+  [/O[[:]sortering]] [/P] [/Q] [/R] [/S] [/T[[:]tidsfält]] [/W] [/X] [/4]\n\n\
   [enhet:][mapp][filnamn]\n\
               Anger enhet, mapp, och/eller filer som skall listes.\n\n\
   /A          Vis filer ved att ange attributter.\n\
@@ -162,6 +162,7 @@ DELAY [/m]n\n\n\
                G  Gruppera mappar först          -  Prefix för omvänd ordning\n\
   /P          Pausa efter varje hel skärmbild.\n\
   /Q          Viser vem som äger filen.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Viser alla filer i angiven mapp och alla undermappar.\n\
   /T          Kontrollerar vilket tidsfält som visas eller blir använt för sortering\n\
   timefelt    C  Skapelse \n\
index 43629dc..a7faba2 100644 (file)
@@ -146,7 +146,7 @@ DELAY [/m]n\n\n\
   /m          n milisâniye olarak belirtir\n\
               yoksa n sâniyedir\n"
     STRING_DIR_HELP1 "DIR [sürücü:][yol][kütük adı] [/A[[:]öz nitelikler]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]dizme düzeni]] [/P] [/Q] [/S] [/T[[:]zaman aralığı]] [/W] [/X] [/4]\n\n\
+  [/O[[:]dizme düzeni]] [/P] [/Q] [/R] [/S] [/T[[:]zaman aralığı]] [/W] [/X] [/4]\n\n\
   [sürücü:][yol][kütük adı]\n\
                 Dizelgelenecek sürücü, dizin veyâ kütükleri belirtir.\n\n\
   /A            Belirtilen öz nitelikli kütükleri görüntüler.\n\
@@ -166,6 +166,7 @@ DELAY [/m]n\n\n\
                  G  Önce dizinleri öbekle      -  Ters dizme için ön ek\n\
   /P            Bir bilgi görüntülüğünden sonra duraklatır.\n\
   /Q            Kütüğün iyesini göster.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S            Belirtilen dizindeki ve tüm alt dizinlerdeki kütükleri\n\
                 görüntüler.\n\
   /T            Dizme için hangi zaman aralığının görüntüleneceğini ya da\n\
index 9838d1a..f7f518c 100644 (file)
@@ -154,7 +154,7 @@ DELAY [/m]n\n\n\
   /m          вказує, що n це мiлiсекунди\n\
               iнакше n це кiлькiсть секунд\n"
     STRING_DIR_HELP1 "DIR [диск:][шлях][iм'я_файлу] [/A[[:]атрибути]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]порядок]] [/P] [/Q] [/S] [/T[[:]час]] [/W] [/X] [/4]\n\n\
+  [/O[[:]порядок]] [/P] [/Q] [/R] [/S] [/T[[:]час]] [/W] [/X] [/4]\n\n\
   [диск:][шлях][iм'я_файлу]\n\
               Визначає диск, директорію, та/чи файли для їх виведення в списку.\n\n\
   /A          Вiдображення файлiв з вказаними атрибутами.\n\
@@ -173,6 +173,7 @@ DELAY [/m]n\n\n\
                G  Почати список з каталогiв     Префiкс ""-"" для зворотнього порядку\n\
   /P          Пауза пiсля кожного заповнення екрану.\n\
   /Q          Вiдображення даних про власника файлу.\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          Вiдображення файлiв з вказаного каталогу та всiх пiдкаталогiв.\n\
   /T          Вибiр поля часу для вiдображення чи сортування\n\
   час         C  Створення\n\
index 52d565e..d62b8b6 100644 (file)
@@ -138,7 +138,7 @@ ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]属性]] 文件 ...\n\n\
 DELAY [/m]n\n\n\
   /m          指定 n 的单位使用毫秒,否则为秒。\n"
     STRING_DIR_HELP1 "DIR [驱动器:][路径][文件名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]\n\
-  [/O[[:]排序顺序]] [/P] [/Q] [/S] [/T[[:]时间字段]] [/W] [/X] [/4]\n\n\
+  [/O[[:]排序顺序]] [/P] [/Q] [/R] [/S] [/T[[:]时间字段]] [/W] [/X] [/4]\n\n\
   [驱动器:][路径][文件名]\n\
               指定要列表显示的驱动器、目录和/或文件。\n\n\
   /A          显示具有指定属性的文件。\n\
@@ -156,6 +156,7 @@ DELAY [/m]n\n\n\
                G  分组目录在前                    -  反转顺序的前缀\n\
   /P          在每屏幕信息输出后停顿。\n\
   /Q          显示文件的所有者。\n\
+  /R          Displays alternate data streams of the files.\n\
   /S          显示指定目录和所有子目录中的文件。\n\
   /T          控制要显示或者用于排序的时间字段。\n\
   时间字段    C  创建时间\n\