how to display files that are not in directory?
-
Hi, I suggest you add Console.WriteLine statements to watch intermediate values, or you single-step in the debugger and watch how things evolve. :)
Luc Pattyn [Forum Guidelines] [My Articles]
Love, happiness and fewer bugs for 2009!
I manage to correct my coding... but there's another problems appear... two main directories that is dirA and dirB.. dirA have 3 folders and it is the main source.. must compare with dirB.. where if in dirA hv folder name ASB01,BP001 and CP001. And each of the folder hv files. I have to compare dirA with dirB where it suppose to display which folder and files in dirA are not in dirB. But when i did this coding, it only compare the first folder, and display the files that are not in dirB. When it comes to the next folder, it didnt compare, it display all the files in dirA. Example if dirA have folder ASB01 with files C4001, C4002 and folder BP001. Meanwhile dirB have folder ASB01 with files C4001 only. It will display ASB001/C4002, and all the files and other folder than ASB001. Iv been trying to find the problems.. :(
Try
Dim dA1, dB1 As DirectoryInfo
Dim dirA2 As FileSystemInfo() = dirA1.GetDirectories
Dim dirB2 As FileSystemInfo() = dirB1.GetDirectoriesFor Each dA1 In dirA2 For Each dB1 In dirB2 If dA1.Name = dB1.Name Then Dim dA2, dB2 As FileSystemInfo Dim dirA3 As FileSystemInfo() = dA1.GetFileSystemInfos Dim dirB3 As FileSystemInfo() = dB1.GetFileSystemInfos For Each dA2 In dirA3 For Each dB2 In dirB3 If dA2.Name = dB2.Name Then Else ListBox1.Items.Add(dA2.FullName) End If Next dB2 Next dA2 Else ListBox1.Items.Add(dA2.FullName) End If Next dB1 Next dA1 Catch ex As Exception MsgBox(ex.Message) End Try End Sub
-
I manage to correct my coding... but there's another problems appear... two main directories that is dirA and dirB.. dirA have 3 folders and it is the main source.. must compare with dirB.. where if in dirA hv folder name ASB01,BP001 and CP001. And each of the folder hv files. I have to compare dirA with dirB where it suppose to display which folder and files in dirA are not in dirB. But when i did this coding, it only compare the first folder, and display the files that are not in dirB. When it comes to the next folder, it didnt compare, it display all the files in dirA. Example if dirA have folder ASB01 with files C4001, C4002 and folder BP001. Meanwhile dirB have folder ASB01 with files C4001 only. It will display ASB001/C4002, and all the files and other folder than ASB001. Iv been trying to find the problems.. :(
Try
Dim dA1, dB1 As DirectoryInfo
Dim dirA2 As FileSystemInfo() = dirA1.GetDirectories
Dim dirB2 As FileSystemInfo() = dirB1.GetDirectoriesFor Each dA1 In dirA2 For Each dB1 In dirB2 If dA1.Name = dB1.Name Then Dim dA2, dB2 As FileSystemInfo Dim dirA3 As FileSystemInfo() = dA1.GetFileSystemInfos Dim dirB3 As FileSystemInfo() = dB1.GetFileSystemInfos For Each dA2 In dirA3 For Each dB2 In dirB3 If dA2.Name = dB2.Name Then Else ListBox1.Items.Add(dA2.FullName) End If Next dB2 Next dA2 Else ListBox1.Items.Add(dA2.FullName) End If Next dB1 Next dA1 Catch ex As Exception MsgBox(ex.Message) End Try End Sub
Hi, there are many mistakes, I'll name a few: 1.
zaimah wrote:
MsgBox(ex.Message)
IMO it is a bad idea to ignore all but the message of an exception; ex.ToString() offers the mesage, the stack traceback and extra information such as the file name in case a file I/O problem occurs. That should be interesting. 2.
zaimah wrote:
For Each dA2 In dirA3 For Each dB2 In dirB3 If dA2.Name = dB2.Name Then Else
The else will execute many times, say dirA3 contains X+Y+Z and dirB3 contains K+L+M+N, then each file in dirA3 will be shown 4 times just because there are 4 items in dirB3. That cannot be what you want. 3. What you seem to be trying is some kind of backup utility, finding files that exist in dirA but not in dirB. To do so, you don't need to enumerate the files in dirB, all it takes is enumerate the files in dirA and check existence of the corresponding file in dirB, hence come up with the fullname the file would have in dirB and test File.Exists(). That will cost you the calculation of the fullnames, and it saves you the nested for loops (and the multiple firing of the else problem, see 2). Two more comments: A. the general solution needs recursion, that would be able to cope with an arbitrary hierarchy of files and folders. B. you can ask GetFiles/GetFolder/... to work recursively for you, hiding all the nested-folder stuff, with one caveat: it then returns many more items (always as full path names) all at once, possibly leading to out-of-memory (or memory low) problems. It could be fine for a small part of a disk or partition, but it would NOT be the way to go for backing up an entire disk (which could hold millions of files)! :)
Luc Pattyn [Forum Guidelines] [My Articles]
Love, happiness and fewer bugs for 2009!
-
Hi, there are many mistakes, I'll name a few: 1.
zaimah wrote:
MsgBox(ex.Message)
IMO it is a bad idea to ignore all but the message of an exception; ex.ToString() offers the mesage, the stack traceback and extra information such as the file name in case a file I/O problem occurs. That should be interesting. 2.
zaimah wrote:
For Each dA2 In dirA3 For Each dB2 In dirB3 If dA2.Name = dB2.Name Then Else
The else will execute many times, say dirA3 contains X+Y+Z and dirB3 contains K+L+M+N, then each file in dirA3 will be shown 4 times just because there are 4 items in dirB3. That cannot be what you want. 3. What you seem to be trying is some kind of backup utility, finding files that exist in dirA but not in dirB. To do so, you don't need to enumerate the files in dirB, all it takes is enumerate the files in dirA and check existence of the corresponding file in dirB, hence come up with the fullname the file would have in dirB and test File.Exists(). That will cost you the calculation of the fullnames, and it saves you the nested for loops (and the multiple firing of the else problem, see 2). Two more comments: A. the general solution needs recursion, that would be able to cope with an arbitrary hierarchy of files and folders. B. you can ask GetFiles/GetFolder/... to work recursively for you, hiding all the nested-folder stuff, with one caveat: it then returns many more items (always as full path names) all at once, possibly leading to out-of-memory (or memory low) problems. It could be fine for a small part of a disk or partition, but it would NOT be the way to go for backing up an entire disk (which could hold millions of files)! :)
Luc Pattyn [Forum Guidelines] [My Articles]
Love, happiness and fewer bugs for 2009!
Thanks for the explaination.. It really helps me understand the problems. iv got a few helps from friends and this are the new coding that i did. but still it keeps on repeating the name of the files..
Dim folderALocation As String = txtdir1.Text
Dim folderBLocation As String = txtdir2.Text'Get all files in Folder A including those found in sub directories
Dim folderAFiles() As String = System.IO.Directory.GetFiles
(folderALocation, "*.*", IO.SearchOption.AllDirectories)'Enumerate through the string array and determine if each file exists within Folder B
For Each fileName As String In folderAFiles
If System.IO.File.Exists(fileName.Replace(folderALocation, folderBLocation)) = False Then ListBox1.Items.Add(fileName) End If Next
-
Thanks for the explaination.. It really helps me understand the problems. iv got a few helps from friends and this are the new coding that i did. but still it keeps on repeating the name of the files..
Dim folderALocation As String = txtdir1.Text
Dim folderBLocation As String = txtdir2.Text'Get all files in Folder A including those found in sub directories
Dim folderAFiles() As String = System.IO.Directory.GetFiles
(folderALocation, "*.*", IO.SearchOption.AllDirectories)'Enumerate through the string array and determine if each file exists within Folder B
For Each fileName As String In folderAFiles
If System.IO.File.Exists(fileName.Replace(folderALocation, folderBLocation)) = False Then ListBox1.Items.Add(fileName) End If Next
Hi, I see you made real progress. I ran your code and it works fine under ideal conditions, i.e. when: - both textboxes contain absolute paths - both paths end on backslash, or none of them do - both paths point to local partitions Otherwise things will or may go wrong. You should program more defensively, i.e. either reject or fix bad input. Minor remarks: 1. string.Replace replaces all occurences so it could happen that your destination gets damaged, assume textbox1="a" and textbox2="b", now all characters a will get replaced in filenames and extensions. The better approach is to compute filename2 as folderBlocation followed by the tail of filename (all but the first N chars where N=folderAlocation.Length) 2. it still may go wrong when you enter the path in a way that is valid but not the standard way, e.g. when there are aliases (could happen with networked drives) or double dots (..\folder) since GetFiles would return a so-called canonical path, not necessarily the way you specified it. 3. I would replace "...Exists = false ..." by "Not Exists..." 4. I would use "*" as a filter instead of "*.*" (non-Windows file systems don't enforce a dot when there is no extension, so you would never see those files) :)
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text, and PictureBoxes for pictures, not drawings.
-
Hi, I see you made real progress. I ran your code and it works fine under ideal conditions, i.e. when: - both textboxes contain absolute paths - both paths end on backslash, or none of them do - both paths point to local partitions Otherwise things will or may go wrong. You should program more defensively, i.e. either reject or fix bad input. Minor remarks: 1. string.Replace replaces all occurences so it could happen that your destination gets damaged, assume textbox1="a" and textbox2="b", now all characters a will get replaced in filenames and extensions. The better approach is to compute filename2 as folderBlocation followed by the tail of filename (all but the first N chars where N=folderAlocation.Length) 2. it still may go wrong when you enter the path in a way that is valid but not the standard way, e.g. when there are aliases (could happen with networked drives) or double dots (..\folder) since GetFiles would return a so-called canonical path, not necessarily the way you specified it. 3. I would replace "...Exists = false ..." by "Not Exists..." 4. I would use "*" as a filter instead of "*.*" (non-Windows file systems don't enforce a dot when there is no extension, so you would never see those files) :)
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text, and PictureBoxes for pictures, not drawings.
This is my folder.. dirA and dirB is on my desktop. I will click folder FTP and PORTAL for txtdir1.Text and txtdir2.Text \FTP \ASB01 C4201 C4432 \BP001 C4186 C4187 C4190 C4191 \BRT01 C4192 C4209 C4212 \PORTAL \ASB01 C4201 \BP001 C4186 C4187 And the output comeout is C:\Documents and Settings\Desktop\FTP\ASB01\C4432 C:\Documents and Settings\Desktop\FTP\BP001\C4186 C:\Documents and Settings\Desktop\FTP\BP001\C4187 C:\Documents and Settings\Desktop\FTP\BP001\C4187 C:\Documents and Settings\Desktop\FTP\BP001\C4190 C:\Documents and Settings\Desktop\FTP\BP001\C4191 C:\Documents and Settings\Desktop\FTP\BP001\C4191 C:\Documents and Settings\Desktop\FTP\BRT01\C4192 C:\Documents and Settings\Desktop\FTP\BRT01\C4209 C:\Documents and Settings\Desktop\FTP\BRT01\C4212 C:\Documents and Settings\Desktop\FTP\BP001\C4187 C:\Documents and Settings\Desktop\FTP\BP001\C4191 C:\Documents and Settings\Desktop\FTP\ASB01\C4432 1. and i dont understand ur remarks number 1. Can u pls explain details? Maybe bcoz im new in this programming, thats why i dont fully understand ur explaination. 2. Remarks number 3, does it means change ".Exists = false" to ".Exists = true" ? 3. I have change "*.*" with "*" but still nothing happen.. Sorry for my stupid question :sigh:
-
This is my folder.. dirA and dirB is on my desktop. I will click folder FTP and PORTAL for txtdir1.Text and txtdir2.Text \FTP \ASB01 C4201 C4432 \BP001 C4186 C4187 C4190 C4191 \BRT01 C4192 C4209 C4212 \PORTAL \ASB01 C4201 \BP001 C4186 C4187 And the output comeout is C:\Documents and Settings\Desktop\FTP\ASB01\C4432 C:\Documents and Settings\Desktop\FTP\BP001\C4186 C:\Documents and Settings\Desktop\FTP\BP001\C4187 C:\Documents and Settings\Desktop\FTP\BP001\C4187 C:\Documents and Settings\Desktop\FTP\BP001\C4190 C:\Documents and Settings\Desktop\FTP\BP001\C4191 C:\Documents and Settings\Desktop\FTP\BP001\C4191 C:\Documents and Settings\Desktop\FTP\BRT01\C4192 C:\Documents and Settings\Desktop\FTP\BRT01\C4209 C:\Documents and Settings\Desktop\FTP\BRT01\C4212 C:\Documents and Settings\Desktop\FTP\BP001\C4187 C:\Documents and Settings\Desktop\FTP\BP001\C4191 C:\Documents and Settings\Desktop\FTP\ASB01\C4432 1. and i dont understand ur remarks number 1. Can u pls explain details? Maybe bcoz im new in this programming, thats why i dont fully understand ur explaination. 2. Remarks number 3, does it means change ".Exists = false" to ".Exists = true" ? 3. I have change "*.*" with "*" but still nothing happen.. Sorry for my stupid question :sigh:
Hi, 1.
if File.Exists(file)=False then
can/should be written asif NOT File.Exists(file) then
, that is what I meant, this is not a mistake just a comment on style. 2. I guess you are using relative paths, your text boxes just contain FTP and PORTAL, instead of C:\Documents and Settings\Desktop\FTP and C:\Documents and Settings\Desktop\PORTAL Now assume one of your files inside FTP is...\FTP\FTP1.DAT
, then String.Replace("FTP", "PORTAL") would turn that into...\PORTAL\PORTAL1.DAT
which is not what you intend; Replace does not care about folders and filenames, it just eagerly replaces. That is way I suggested not using Replace, but performing a string concatenation; this only works if the paths are absolute, i.e. the thing to be replaced starts at the first character (replace C:\Documents and Settings\Desktop\FTP by C:\Documents and Settings\Desktop\PORTAL) 3. a general debugging rule: as long as your code does not behave the way you want, split a more complex line in multiple lines and watch the intermediate values, like so:...
dim filename2 as string=filename.Replace(AFolder,BFolder)
Console.WriteLine("--- Going to look if this exists: "&filename2)
if not File.Exists(filename2) then
...That way you will see whether or not you are checking the right filenames, or are having some trouble with paths and/or replace issues. Of course you can use myListBox.Add() or whatever you prefer to see intermediate values... listing them to a console or listbox is much easier than watching them through debug commands or through MessageBox.Show statements (they get irritating pretty soon). 4. your code ran fine with me when the textboxes contained "H:\someFolder\" and "H:\someFolderCopy\"; it discovered 2 files missing out of several thousand. :)
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text, and PictureBoxes for pictures, not drawings.
-
Hi, 1.
if File.Exists(file)=False then
can/should be written asif NOT File.Exists(file) then
, that is what I meant, this is not a mistake just a comment on style. 2. I guess you are using relative paths, your text boxes just contain FTP and PORTAL, instead of C:\Documents and Settings\Desktop\FTP and C:\Documents and Settings\Desktop\PORTAL Now assume one of your files inside FTP is...\FTP\FTP1.DAT
, then String.Replace("FTP", "PORTAL") would turn that into...\PORTAL\PORTAL1.DAT
which is not what you intend; Replace does not care about folders and filenames, it just eagerly replaces. That is way I suggested not using Replace, but performing a string concatenation; this only works if the paths are absolute, i.e. the thing to be replaced starts at the first character (replace C:\Documents and Settings\Desktop\FTP by C:\Documents and Settings\Desktop\PORTAL) 3. a general debugging rule: as long as your code does not behave the way you want, split a more complex line in multiple lines and watch the intermediate values, like so:...
dim filename2 as string=filename.Replace(AFolder,BFolder)
Console.WriteLine("--- Going to look if this exists: "&filename2)
if not File.Exists(filename2) then
...That way you will see whether or not you are checking the right filenames, or are having some trouble with paths and/or replace issues. Of course you can use myListBox.Add() or whatever you prefer to see intermediate values... listing them to a console or listbox is much easier than watching them through debug commands or through MessageBox.Show statements (they get irritating pretty soon). 4. your code ran fine with me when the textboxes contained "H:\someFolder\" and "H:\someFolderCopy\"; it discovered 2 files missing out of several thousand. :)
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text, and PictureBoxes for pictures, not drawings.
hi Luc :) 1. yup, now i understand what u were trying to explain 2. sorry, i used wrong words.. my english is not so good.. I choose the full path name C:\Documents and Settings\Desktop\FTP and C:\Documents and Settings\Desktop\PORTAL 3. again, thank you for ur explaination.. ;) 4. That is why im confiused bcoz my friend run this code witth the expected output, but mine didnt.. this is getting weird.. :)
-
hi Luc :) 1. yup, now i understand what u were trying to explain 2. sorry, i used wrong words.. my english is not so good.. I choose the full path name C:\Documents and Settings\Desktop\FTP and C:\Documents and Settings\Desktop\PORTAL 3. again, thank you for ur explaination.. ;) 4. That is why im confiused bcoz my friend run this code witth the expected output, but mine didnt.. this is getting weird.. :)
You're welcome. If it fails, look at the intermediate values; maybe you have a typo somewhere. :)
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text, and PictureBoxes for pictures, not drawings.
-
You're welcome. If it fails, look at the intermediate values; maybe you have a typo somewhere. :)
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text, and PictureBoxes for pictures, not drawings.
yup.. there's sum thing wrong with the directory that i select.. it can run rite now thanks :).. but another problem come out :~ actually i have to select files that must need to map drive 1st. but when i used this coding to select files in my computer, it cannot select the drive from portal and ftp that i has map already.. can u pls take a look at my coding?
Dim folderopen As New FolderBrowserDialog
With folderopen
.RootFolder = Environment.SpecialFolder.Desktop
.SelectedPath = "C:\DOCUMENT"
.Description = "Select the source directory"
If .ShowDialog = Windows.Forms.DialogResult.OK Then
' Display the selected folder if the user clicked on the OK button.
MessageBox.Show(.SelectedPath)
txtdir2.Text = .SelectedPath
End IfEnd With
-
yup.. there's sum thing wrong with the directory that i select.. it can run rite now thanks :).. but another problem come out :~ actually i have to select files that must need to map drive 1st. but when i used this coding to select files in my computer, it cannot select the drive from portal and ftp that i has map already.. can u pls take a look at my coding?
Dim folderopen As New FolderBrowserDialog
With folderopen
.RootFolder = Environment.SpecialFolder.Desktop
.SelectedPath = "C:\DOCUMENT"
.Description = "Select the source directory"
If .ShowDialog = Windows.Forms.DialogResult.OK Then
' Display the selected folder if the user clicked on the OK button.
MessageBox.Show(.SelectedPath)
txtdir2.Text = .SelectedPath
End IfEnd With
Hi, I'm not familiar with FolderBrowserDialog, but you seem to violate the following MSDN remark: "If the SelectedPath property is set before showing the dialog box, the folder with this path will be the selected folder, as long as SelectedPath is set to an absolute path that is a subfolder of RootFolder (or more accurately, points to a subfolder of the shell namespace represented by RootFolder)." C:\Document is not inside SpecialFolder.Desktop (which is located much deeper, its exact position depends on you Windows version). :)
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text, and PictureBoxes for pictures, not drawings.