Re: Request for help; A dir cmd (C-001655)
- Posted by DerekParnell (admin) May 04, 2009
- 910 views
znorq2 said...
Hi,
I'm in urgent need for a directory command (Must be in Euphoria v3 / Win32Lib) that can list the following information;
- File/folder name - Owner - Accessed date
I'd like to have the output in an csv type file like this; name;owner;accessed
As it is quite urgent, I don't have the time to sit down and figure this out for my self, so I'd appreciate if any of you gentlemen/women could help me out here?
Thank you.
Kenneth / ZNorQ.
To get the file names from a directory ...
#define _WIN32_WINNT 0x0501 #include <windows.h> #include <stdio.h> #include <strsafe.h> #include <malloc.h> #define BUFSIZE MAX_PATH int main(int argc, char *argv[]) { WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwError; LPSTR DirSpec; size_t length_of_arg; DirSpec = (LPSTR) malloc (BUFSIZE); // Check for command-line parameter; otherwise, print usage. if(argc != 2) { printf("Usage: Test <dir>\n"); return 2; } // Check that the input is not larger than allowed. StringCbLength(argv[1], BUFSIZE, &length_of_arg); if (length_of_arg > (BUFSIZE - 2)) { printf("Input directory is too large.\n"); return 3; } printf ("Target directory is %s.\n", argv[1]); // Prepare string for use with FindFile functions. First, // copy the string to a buffer, then append '\*' to the // directory name. StringCbCopyN (DirSpec, BUFSIZE, argv[1], length_of_arg+1); StringCbCatN (DirSpec, BUFSIZE, "\\*", 3); // Find the first file in the directory. hFind = FindFirstFile(DirSpec, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { printf ("Invalid file handle. Error is %u.\n", GetLastError()); return (-1); } else { printf ("First file name is %s.\n", FindFileData.cFileName); // List all the other files in the directory. while (FindNextFile(hFind, &FindFileData) != 0) { printf ("Next file name is %s.\n", FindFileData.cFileName); } dwError = GetLastError(); FindClose(hFind); if (dwError != ERROR_NO_MORE_FILES) { printf ("FindNextFile error. Error is %u.\n", dwError); return (-1); } } free(DirSpec); return (0); }
To get the owner name and access date ...
#include <stdio.h> #include <windows.h> #include <tchar.h> #include "accctrl.h" #include "aclapi.h" int main(int argc, char **argv) { DWORD dwRtnCode = 0; PSID pSidOwner; BOOL bRtnBool = TRUE; LPTSTR AcctName, DomainName; DWORD dwAcctName = 1, dwDomainName = 1; SID_NAME_USE eUse = SidTypeUnknown; HANDLE hFile; PSECURITY_DESCRIPTOR pSD; FILETIME CreationTime; FILETIME LastAccessTime; FILETIME LastWriteTime; SYSTEMTIME AccessDT; // Get the handle of an existing file. hFile = CreateFile( FileName, // TCHAR * GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Check GetLastError for CreateFile error code. if (hFile == INVALID_HANDLE_VALUE) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); _tprintf(TEXT("CreateFile error = %d\n"), dwErrorCode); return -1; } dwRtnCode = GetFileTime( hFile, &CreationTime, &LastAccessTime, &LastWriteTime ); FileTimeToSystemTime( &LastAcessTime, &AccesDT ); char AccessDateString[100]; AccessDateString = sprintf("%04d/%02d/%02d %0d:%02d:%02d", AccessDT.wYear, AccessDT.wMonth, AccessDT.wDay, AccessDT.wHour; AccessDT.wMinute, AccessDT.wSecond ); // Allocate memory for the SID structure. pSidOwner = (PSID)GlobalAlloc( GMEM_FIXED, sizeof(PSID)); // Allocate memory for the security descriptor structure. pSD = (PSECURITY_DESCRIPTOR)GlobalAlloc( GMEM_FIXED, sizeof(PSECURITY_DESCRIPTOR)); // Get the owner SID of the file. dwRtnCode = GetSecurityInfo( hFile, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, &pSidOwner, NULL, NULL, NULL, &pSD); // Check GetLastError for GetSecurityInfo error condition. if (dwRtnCode != ERROR_SUCCESS) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); _tprintf(TEXT("GetSecurityInfo error = %d\n"), dwErrorCode); return -1; } // First call to LookupAccountSid to get the buffer sizes. bRtnBool = LookupAccountSid( NULL, // local computer pSidOwner, AcctName, (LPDWORD)&dwAcctName, DomainName, (LPDWORD)&dwDomainName, &eUse); // Reallocate memory for the buffers. AcctName = (char *)GlobalAlloc( GMEM_FIXED, dwAcctName); // Check GetLastError for GlobalAlloc error condition. if (AcctName == NULL) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); _tprintf(TEXT("GlobalAlloc error = %d\n"), dwErrorCode); return -1; } DomainName = (char *)GlobalAlloc( GMEM_FIXED, dwDomainName); // Check GetLastError for GlobalAlloc error condition. if (DomainName == NULL) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); _tprintf(TEXT("GlobalAlloc error = %d\n"), dwErrorCode); return -1; } // Second call to LookupAccountSid to get the account name. bRtnBool = LookupAccountSid( NULL, // name of local or remote computer pSidOwner, // security identifier AcctName, // account name buffer (LPDWORD)&dwAcctName, // size of account name buffer DomainName, // domain name (LPDWORD)&dwDomainName, // size of domain name buffer &eUse); // SID type // Check GetLastError for LookupAccountSid error condition. if (bRtnBool == FALSE) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); if (dwErrorCode == ERROR_NONE_MAPPED) _tprintf(TEXT ("Account owner not found for specified SID.\n")); else _tprintf(TEXT("Error in LookupAccountSid.\n")); return -1; } else if (bRtnBool == TRUE) // Print the account name. _tprintf(TEXT("Account owner = %s\n"), AcctName); return 0; }