EnglishРусский  

   ..

   samefiles.1.g

Ads

Scriptius script builder
Provides the best choice in work automation and great time saving features.

CreateInstall
Freeware and commercial installers.

Cell Phone Batteries
Batteries Plus offers batteries for laptop, camcorder, cell phone, camera.

Gentee needs your help!
How to advertise with us
 
laptop battery

source\samples\samefiles\samefiles.1.g
  1 /******************************************************************************
  2 *
  3 * Copyright (C) 2005, The Gentee Group. All rights reserved. 
  4 * This file is part of the Gentee open source project - http://www.gentee.com. 
  5 * 
  6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT"). 
  7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS 
  8 * ACCEPTANCE OF THE AGREEMENT.
  9 *
 10 * ID: samefiles 17.10.06 0.0.A.
 11 *
 12 * Author: Alexey Krivonogov ( gentee )
 13 *
 14 ******************************************************************************/
 15 
 16 type  finf
 17 {
 18    str   name
 19    uint  size
 20    uint  owner
 21 }
 22 
 23 global
 24 {
 25    arr dirs  of finf
 26    arr files of finf
 27    arr sizes of uint
 28    str output
 29 }
 30 
 31 func uint newdir( str name, uint owner )
 32 {
 33    uint i
 34    
 35    i = dirs.expand( 1 )
 36    dirs[ i ].name = name
 37    dirs[ i ].owner = owner
 38    return i
 39 }
 40 
 41 func uint newfile( str name, uint size owner )
 42 {
 43    uint i
 44    
 45    i = files.expand( 1 )
 46    files[ i ].name = name
 47    files[ i ].size = size
 48    files[ i ].owner = owner
 49    return i
 50 }
 51 
 52 func scanfolder( str wildcard, uint owner )
 53 {
 54    ffind fd
 55    
 56    fd.init( wildcard, $FIND_FILE | $FIND_DIR )
 57    foreach cur, fd
 58    {
 59       if cur.attrib & $FILE_ATTRIBUTE_DIRECTORY
 60       {
 61          scanfolder( cur.fullname + "\\*.*", newdir( cur.name, owner ))
 62       }
 63       elif !cur.sizehi : newfile( cur.name, cur.sizelo, owner )      
 64    }
 65 } 
 66 
 67 func scaninit( str folder )
 68 {
 69    str wildcard
 70 
 71    folder.fdelslash()   
 72    @"Scanning \( folder )\n"
 73    scanfolder( (wildcard = folder ).faddname( "*.*" ), newdir( folder, 0 ))
 74 }
 75 
 76 func int sortsize( uint left right )
 77 {
 78    return int( files[ left->uint ].size ) - int( files[ right->uint ].size )
 79 }
 80 
 81 func sortfiles
 82 {
 83    uint i
 84    
 85    @"Sorting...\n"
 86    sizes.expand( *files )
 87    fornum i, *sizes : sizes[ i ] = i
 88 
 89    sizes.sort( &sortsize ) 
 90 }
 91 
 92 func str getdir( uint id, str ret )
 93 {
 94    uint owner = dirs[ id ].owner
 95 
 96    if owner : getdir( owner, ret )
 97    return ret.faddname( dirs[ id ].name )
 98 }
 99 
100 func str getfile( uint id, str ret )
101 {
102    ret.clear()
103    
104    getdir( files[ id ].owner, ret )
105    return ret.faddname( files[ id ].name )
106 }
107 
108 func compare
109 {
110    uint i id next j found count
111    str  idname nextname 
112    
113    @"Looking for duplicates...\n"
114    
115    fornum i, *sizes - 1
116    {
117       id = sizes[ i ]
118 
119       if !*files[ id ].name : continue
120 
121       found = 0            
122       next = sizes[ j = i + 1 ]
123       
124       while files[ id ].size == files[ next ].size
125       {
126          if *files[ next ].name &&
127              isequalfiles( getfile( id, idname ), getfile( next, nextname ))
128          {
129             if !found
130             {
131                output @ "\lSize: \(files[ id ].size) ========\l\( idname )\l" 
132             }
133             count++
134             ( output @ nextname ) @"\l"
135             
136             found = 1
137             files[ next ].name.clear()
138          }
139          if ++j == *sizes : break
140          next = sizes[ j ]
141       }
142       if i && !( i & 0x3F ) 
143       {
144          @ "\rApproved files: \(i) Found the same files: \(count)"
145       }
146    }   
147    output @ "\l=================\lApproved files: \(*files) Found the same files: \(count)\l"
148 }
149 
150 func init
151 {
152    dirs.reserve( 1000 )
153    files.reserve( 20000 )
154    output.reserve( 1000000 )
155    dirs.expand( 1 )
156 }
157 
158 func search
159 {
160    @"All files : \( *files )\n"
161   
162    if !*files : return
163    sortfiles()
164    compare()
165    output.write("samefiles.txt")
166    shell( "samefiles.txt" )
167 }
168 
169 func main<main>
170 {
171    str  folder 
172    
173    init()
174       
175    congetstr("Specify a folder or a drive (C:) for searching: \n", folder )
176    scaninit( folder )
177    search()   
178 }
Edit