GEOSoft Posted January 28, 2004 Share Posted January 28, 2004 I need to get the file attributes and put them into a message box as complete words. If the Attribs were set RSH then the message box text would be Read Only / System / Hidden or if the Attribs were A then the text would be Archive. I suspect it should be done as an array but how? Next one is going to get pretty hairy I think. I have two files, $File1 And $File2. I have to compare the two files. If the first line in $File2 does not appear any place in $File1 then Append it to a new file, $File3 and then repeat the process for the next line with any non-matching lines added to $File3. The whole idea is that there will probably be duplicate entries between $File1 and $File2 so what I want to do is extract differences from $File2. George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
CyberSlug Posted January 28, 2004 Share Posted January 28, 2004 (edited) The quick-n-dirty way for your first question: $attrib = FileGetAttrib ( "filename" ) If @error Then MsgBox(4096,"Error", "Could not get file attributes.") Exit EndIf $tmp = "" If StringInStr($attrib, "R") Then $tmp = $tmp & "ReadOnly /" If StringInStr($attrib, "A") Then $tmp = $tmp & "Archive /" If StringInStr($attrib, "S") Then $tmp = $tmp & "System /" If StringInStr($attrib, "H") Then $tmp = $tmp & "Hidden /" If StringInStr($attrib, "N") Then $tmp = $tmp & "Normal /" If StringInStr($attrib, "D") Then $tmp = $tmp & "Directory /" If StringInStr($attrib, "O") Then $tmp = $tmp & "Offline /" If StringInStr($attrib, "C") Then $tmp = $tmp & "Compressed /" If StringInStr($attrib, "T") Then $tmp = $tmp & "Temporary /" $tmp = StringTrimRight($tmp, 2);remove trailing slash MsgBox(4096,"Attribs", $tmp) Edited January 28, 2004 by CyberSlug Use Mozilla | Take a look at My Disorganized AutoIt stuff | Very very old: AutoBuilder 11 Jan 2005 prototype I need to update my sig! Link to comment Share on other sites More sharing options...
GEOSoft Posted January 28, 2004 Author Share Posted January 28, 2004 That's a start similar to what I was trying but I still think there must be a better way. Thanks CS The second problem is the one I think is going to get real dirty. George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
Valik Posted January 28, 2004 Share Posted January 28, 2004 The second one probably won't be as hard as it is time consuming. No matter how you shake it, you're going to be doing lots of redundant parsing which will grow exponentially based on the file size. You have two easy-to-write options. One would be 2 loops, the outer loop reading one line at a time from $file1, the inner loop runs through every line in $file2 until a match or EOF is found. Then $file1 goes to line 2 and the inner loops runs through $file2 again. The alternative is very similar, but it involves building 2 arrays, one for each file. Then doing the same 2 loop structure. Only this time, any matching lines can be set to "" or 0 or something so they aren't compared quite as heavily. Link to comment Share on other sites More sharing options...
Developers Jos Posted January 28, 2004 Developers Share Posted January 28, 2004 below scripts would work but will slow down a lot when running against a file with many records... Are the files sorted?? it would be much easier if both files are sorted, then you could match records... $file1 = "test1.txt" $file2 = "test2.txt" $file3 = "test3.txt" $fh2=fileopen("test2.txt",0) If $fh2 = -1 Then MsgBox(0, "Error", "Unable to open file2.") Exit EndIf while 1 $line2 = FileReadLine($fh2) If @error = -1 Then ExitLoop $fh1=fileopen($file1,0) If $fh1 = -1 Then MsgBox(0, "Error", "Unable to open file1.") Exit EndIf while 1 $line1 = FileReadLine($fh1) If @error = -1 Then Filewriteline($file3,$line2) ExitLoop endif if $Line1 == $Line2 then exitloop Wend fileclose($fh1) Wend Fileclose($fh2) SciTE4AutoIt3 Full installer Download page  - Beta files    Read before posting   How to post scriptsource   Forum etiquette Forum Rules  Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
GEOSoft Posted January 28, 2004 Author Share Posted January 28, 2004 Are the files sorted?? it would be much easier if both files are sorted, then you could match records... I wish they were but unfortunately they are usually a jumbled mess. I'm going to try working from your script. At least it's going in the right direction. I can see where I will have to make some changes but not serious ones. For instamce $File3 does not have to be created unless there is a difference but it wouldn't really matter, I could just set it to delete the file if it's empty. It gets even worse after but I have that part figured out, if a line is commented out the line has to be deleted. The good part is that this will be a stand-alone file for the app and the user *should* only have to run it one time, right after the installation.Thanks a lot. George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
Developers Jos Posted January 28, 2004 Developers Share Posted January 28, 2004 For instamce $File3 does not have to be created unless there is a difference but it wouldn't really matterthink that file3 will only be created when there is a record to write... just for anybody interested... below script will match 2 file that are sorted: expandcollapse popup$file1 = "test1.txt" $file2 = "test2.txt" $file3 = "test3.txt" $EOF1 = 0 $EOF2 = 0 $Line1 = "" $Line2 = "" ; $fh1=fileopen($file1,0) If $fh1 = -1 Then MsgBox(0, "Error", "Unable to open file1.") Exit EndIf ; $fh2=fileopen("test2.txt",0) If $fh2 = -1 Then MsgBox(0, "Error", "Unable to open file2.") Exit EndIf ; read1() read2() ; while 1 select ; Both EOF Case $EOF1 and $EOF2 ExitLoop ; matching records Case $Line1 == $Line2 and not $EOF1 and not $EOF2 Filewriteline("matches.txt" ,$line1 & "=" & $line2 & @LF) read1() read2() ; file 1 record not in file2 Case $Line1 < $Line2 or $EOF2 Filewriteline("1notin2.txt" ,$line1 & @LF) read1() ; file 2 record not in file1 Case $Line1 > $Line2 or $EOF1 Filewriteline("2notin1.txt" ,$line2 & @LF) read2() endselect Wend fileclose($fh1) Fileclose($fh2) Func read1() $line1 = FileReadLine($fh1) If @error = -1 Then $EOF1 = 1 EndIf EndFunc Func read2() $line2 = FileReadLine($fh2) If @error = -1 Then $EOF2 = 1 EndIf EndFunc SciTE4AutoIt3 Full installer Download page  - Beta files    Read before posting   How to post scriptsource   Forum etiquette Forum Rules  Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
CyberSlug Posted January 29, 2004 Share Posted January 29, 2004 Thought of an alternative to your first question which relies on the fact that the captial letters R A S H N D O C T only appear once in the full names of Read-only Archive etc. $input = StringSplit("R,A,S,H,N,D,O,C,T",",") $output = StringSplit("Read-only /, Archive /, System /, Hidden /, Normal /, Directory /, Offline /, Compressed /, Temporary /",",") $attrib = FileGetAttrib("c:\boot.ini") For $i = 1 to 9 $attrib = StringReplace($attrib, $input[$i], $output[$i], 0, 1) ; last arg in StringReplace means case sensitive Next $attrib = StringTrimRight($attrib, 2) MsgBox(4096,"Attribs", $attrib) Of course, this could be wrapped in a user function. Use Mozilla | Take a look at My Disorganized AutoIt stuff | Very very old: AutoBuilder 11 Jan 2005 prototype I need to update my sig! Link to comment Share on other sites More sharing options...
GEOSoft Posted January 29, 2004 Author Share Posted January 29, 2004 Much better Thanks CS George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
GEOSoft Posted January 29, 2004 Author Share Posted January 29, 2004 (edited) All it needed was a bit of error checking and that made it work just dandy. $input = StringSplit("R,A,S,H,N,D,O,C,T",",") $output = StringSplit("Read-only /, Archive /, System /, Hidden /, Normal /, Directory /, Offline /, Compressed /, Temporary /",",") $Attrib = FileGetAttrib ($File1) If @error Then MsgBox(4096,"Error", "Unable to get file attributes for "&$File1) Exit EndIf For $i = 1 to 9 $attrib = StringReplace($attrib, $input[$i], $output[$i], 0, 1) ; last arg in StringReplace means case sensitive Next $attrib = StringTrimRight($attrib, 2) MsgBox(4096,"Attribs", $attrib) I was able to shorten my code a bit because the file in question would only have a combination of the first 4 so I just deleted the other 5 and changed the For $i statement. Edited January 29, 2004 by GEOSoft George Question about decompiling code? Read the decompiling FAQ and don't bother posting the question in the forums.Be sure to read and follow the forum rules. -AKA the AutoIt Reading and Comprehension Skills test.*** The PCRE (Regular Expression) ToolKit for AutoIT - (Updated Oct 20, 2011 ver:3.0.1.13) - Please update your current version before filing any bug reports. The installer now includes both 32 and 64 bit versions. No change in version number. Visit my Blog .. currently not active but it will soon be resplendent with news and views. Also please remove any links you may have to my website. it is soon to be closed and replaced with something else. "Old age and treachery will always overcome youth and skill!" Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now