home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / DATABASE / DUPLIC.ZIP / FIND_DUP.PRG next >
Text File  |  1992-04-19  |  4KB  |  152 lines

  1. *************************************************************************
  2. * FIND_DUP.PRG 
  3. *
  4. * A small utility to build a database of all the files in a directory
  5. * and its subdirectory. It then flags definite and probable duplicates.
  6. *
  7. * Requires AMERICAN DOS 5.0 or higher to work properly.
  8. * If you have a non-american version of DOS 5.0, you must change some 
  9. * lines in the scan loop to accomodate for the language of your DIR 
  10. * listing.
  11. *
  12. *************************************************************************
  13. *
  14. * Author : Stephane DESNAULT - CIS 100034,2657
  15. *
  16. * NOT industrial strength... simply useful !
  17. *
  18. *************************************************************************
  19.  
  20. * Get the path to search.... C:\ is the default
  21.  
  22. SET TALK OFF
  23.  
  24. choice   =""
  25. path     ="C:\                                                  "
  26. file_spec="*.*         "
  27.  
  28. DEFINE WINDOW get_path FROM 10,10 TO 20,70
  29. ACTIVATE WINDOW get_path
  30.     @ 1,3 SAY "Path to search for duplicates :"
  31.     && The valid clause checks that the directory to search exists.
  32.     @ 3,3 GET path ;
  33.         VALID FILE(ALLTRIM(path)+IIF(RIGHT(ALLTRIM(path),1)="\","NUL","\NUL")) ;
  34.         ERROR ALLTRIM(path)+" is not a valid DOS path !"
  35.     @ 5,3 SAY "File mask : "GET file_spec
  36.     @ 7,3 GET choice PICTURE '@*H \!\<OK;\?\<Cancel' SIZE 1,8
  37.     READ CYCLE
  38. RELEASE WINDOW get_path
  39.  
  40. * Quit now if the user aborts
  41.  
  42. IF choice="Cancel"
  43.     RETURN
  44. ENDIF
  45.  
  46. * Build the file spec to look for...
  47.  
  48. path=ALLTRIM(path)
  49. file_spec = IIF(RIGHT(path,1)="\",path,path+"\")+ALLTRIM(file_spec)
  50.  
  51. * List a directory to a temporary text file
  52.  
  53. ? "Listing the directory.... Please wait"
  54.  
  55. temp_name=SYS(3)+".DIR"
  56. RUN dir &file_spec /s > &temp_name
  57.  
  58. * Create the output DIR.DBF table. All fields are text, no conversion is done.
  59.  
  60. ? "Building the archive file.... Please wait"
  61.  
  62. SET SAFETY ON
  63. CREATE TABLE dir.dbf    (    ;
  64.     directory    C(80)        , ;
  65.     name        C(08)        , ;
  66.     extension   C(03)        , ;
  67.     size        C(09)        , ;
  68.     date        C(08)        , ;
  69.     time        C(06)        , ;
  70.     duplicate   L            , ;
  71.     suspect        L        )
  72.  
  73. * Scan the directory listing and fill the output table
  74.  
  75. input_id=FOPEN(temp_name)
  76. DO WHILE ! FEOF(input_id)
  77.     curr_line=FGETS(input_id)
  78.     DO CASE 
  79.         CASE LEFT(curr_line,12)='Directory of'
  80.             curr_dir=SUBSTR(curr_line,13,LEN(curr_line))
  81.         CASE (SUBSTR(curr_line,36,1)=":") .AND. !("<DIR>" $ curr_line)
  82.             APPEND BLANK
  83.             REPLACE directory WITH curr_dir                 , ;
  84.                     name      WITH SUBSTR(curr_line, 1,8)    , ;
  85.                     extension WITH SUBSTR(curr_line,10,3)    , ;
  86.                     size      WITH SUBSTR(curr_line,14,9)    , ;
  87.                     date      WITH SUBSTR(curr_line,24,8)    , ;
  88.                     time      WITH SUBSTR(curr_line,34,6)
  89.     ENDCASE
  90. ENDDO
  91.  
  92. * Index on name+extension+size+date+time
  93.  
  94. SET TALK ON
  95. INDEX ON name+extension+size+date+time TAG id
  96. SET TALK OFF
  97.  
  98. * Scan for evident and probable duplicates. An evident duplicate is when
  99. * all the columns except directory are alike. A probable duplicate is
  100. * when name and extension are alike, so you might suspect successive 
  101. * versions of the same file. A duplicate is also a suspect.
  102.  
  103. * Do not use SCAN...ENDSCAN, since we're navigating the file inside
  104. * the loop.
  105.  
  106. GO TOP
  107. curr_name=""    && holds preceding file name and extension
  108. curr_sdt =""    && holds preceding file size date and time
  109. is_dup     =.F.    && holds whether preceding file was already a duplicate
  110. is_susp     =.F.    && holds whether preceding file was already a suspect
  111.  
  112. ? "Scanning for duplicate or suspect files...."
  113.  
  114. DO WHILE ! EOF()
  115.     && If file is suspect...
  116.     IF curr_name=name+extension
  117.         && preceding file is a suspect too, of course !
  118.         IF ! is_susp
  119.             SKIP-1
  120.             REPLACE suspect WITH .T.
  121.             SKIP
  122.         ENDIF
  123.         REPLACE suspect WITH .T.
  124.         is_susp=.T.
  125.         && It might also be a confirmed duplicate...
  126.         IF curr_sdt=size+date+time
  127.             && preceding file is a duplicate too, of course !
  128.             IF ! is_dup
  129.                 SKIP-1
  130.                 REPLACE duplicate WITH .T.
  131.                 SKIP
  132.             ENDIF
  133.             REPLACE duplicate WITH .T.
  134.             is_dup=.T.
  135.         ELSE
  136.             is_dup=.F.
  137.         ENDIF
  138.     ELSE
  139.         is_susp=.F.
  140.     ENDIF
  141.     curr_name=name+extension 
  142.     curr_sdt =size+date+time
  143.     SKIP
  144. ENDDO
  145.  
  146. =FCLOSE(input_id)
  147. ERASE &temp_name
  148.  
  149. ? "The file DIR.DBF now contains a listing of all the files on your"
  150. ? "hard disk, flagged for certain and probable duplicates."
  151.  
  152. RETURN