56 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			56 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								USING: alien calendar io io-internals kernel libs-io math
							 | 
						||
| 
								 | 
							
								namespaces prettyprint sequences windows-api ;
							 | 
						||
| 
								 | 
							
								IN: shell
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: winnt-shell ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								T{ winnt-shell } \ shell set-global
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: file name size mtime attributes ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ((directory*)) ( handle -- )
							 | 
						||
| 
								 | 
							
								    "WIN32_FIND_DATA" <c-object> [ FindNextFile ] 2keep
							 | 
						||
| 
								 | 
							
								    rot zero? [ 2drop ] [ , ((directory*)) ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (directory*) ( path -- )
							 | 
						||
| 
								 | 
							
								    "WIN32_FIND_DATA" <c-object> [
							 | 
						||
| 
								 | 
							
								        FindFirstFile dup INVALID_HANDLE_VALUE = [
							 | 
						||
| 
								 | 
							
								            win32-error
							 | 
						||
| 
								 | 
							
								        ] when
							 | 
						||
| 
								 | 
							
								    ] keep ,
							 | 
						||
| 
								 | 
							
								    [ ((directory*)) ] keep FindClose win32-error=0/f ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: append-star ( path -- path )
							 | 
						||
| 
								 | 
							
								    dup peek CHAR: \\ = "*" "\\*" ? append ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: winnt-shell directory* ( path -- seq )
							 | 
						||
| 
								 | 
							
								    normalize-pathname append-star [ (directory*) ] { } make ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: WIN32_FIND_DATA>file-size ( WIN32_FILE_ATTRIBUTE_DATA -- n )
							 | 
						||
| 
								 | 
							
								    [ WIN32_FIND_DATA-nFileSizeLow ] keep
							 | 
						||
| 
								 | 
							
								    WIN32_FIND_DATA-nFileSizeHigh 32 shift + ; 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: winnt-shell make-file ( WIN32_FIND_DATA -- file )
							 | 
						||
| 
								 | 
							
								    [ WIN32_FIND_DATA-cFileName alien>u16-string ] keep
							 | 
						||
| 
								 | 
							
								    [ WIN32_FIND_DATA>file-size ] keep
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        WIN32_FIND_DATA-ftCreationTime
							 | 
						||
| 
								 | 
							
								        FILETIME>timestamp >local-time
							 | 
						||
| 
								 | 
							
								    ] keep
							 | 
						||
| 
								 | 
							
								    WIN32_FIND_DATA-dwFileAttributes <file> ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: winnt-shell file. ( file -- )
							 | 
						||
| 
								 | 
							
								    [ [ file-attributes >oct write ] keep ] with-cell
							 | 
						||
| 
								 | 
							
								    [ bl ] with-cell
							 | 
						||
| 
								 | 
							
								    [ [ file-size unparse write ] keep ] with-cell
							 | 
						||
| 
								 | 
							
								    [ bl ] with-cell
							 | 
						||
| 
								 | 
							
								    [ [ file-mtime file-time-string write ] keep ] with-cell
							 | 
						||
| 
								 | 
							
								    [ bl ] with-cell
							 | 
						||
| 
								 | 
							
								    [ file-name write ] with-cell ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: winnt-shell touch-file ( path -- )
							 | 
						||
| 
								 | 
							
								    #! Set the file write time to 'now'
							 | 
						||
| 
								 | 
							
								    normalize-pathname
							 | 
						||
| 
								 | 
							
								    dup maybe-create-file [ drop ] [ now set-file-write-time ] if ;
							 | 
						||
| 
								 | 
							
								
							 |