|
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)!
|
|
|
|
|
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)
|
|
|
|
|
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
|
|
|
|
|
Hi,
1.
if File.Exists(file)=False then can/should be written as if 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.
|
|
|
|
|
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.
|
|
|
|
|
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 If
End 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).
|
|
|
|
|
Hallo
I have a function for retrieving the last insertid from Mysql, now I have to change the program for sql server
For Mysql the function is :
Public Shared Function GetLastID() As Integer
Dim ID As Integer
Dim Cmd As New MySql.Data.MySqlClient.MySqlCommand()
Cmd.Connection = Connection
Cmd.CommandText = "SELECT LAST_INSERT_ID()"
Cmd.Connectie.Open()
ID = Cmd.ExecuteScalar
Cmd.Connectie.Close()
Return ID
End Function
For SQL server I have tried :
Public Shared Function GetLastID() As Integer
Dim ID As Integer
Dim Cmd As New System.Data.SqlClient.SqlCommand
Cmd.Connection = Connection
Cmd.CommandText = "SELECT @@IDENTITY"
Cmd.Connectie.Open()
ID = Cmd.ExecuteScalar
Cmd.Connectie.Close()
Return ID
End Function
It works for Mysql, but not for SQL, error : Conversion from type 'DBNull' to type 'Integer' is not valid.
Can anyone help please
|
|
|
|
|
@@IDENTITY is generally used in a stored procedure to get the id of the last inserted record. Selecting from the client is probably not valid, certainly if you are getting a null return.
Also there is no way of knowing what table you are getting the @@Identity for. Do some reading in BOL for more details.
To force a numeric try
Select Isull(@@IDENTITY,0)
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Read the documentation[^] to know how @@IDENTITY works. It retruns the last identity value inserted for a specific session or NULL if nothing is available. In your code, you are opening a new connection to execute @@IDENTITY which will always return NULL .
As a workaround, you should execute this query before closing the connection which inserted the record. You will get the value then. It will be like,
Open connection
Execute insert statement
Execute the @@IDENTITY selection
Close the connection If you use stored procedures for insertion, the most obvious method is to add an output parameter to the SP and write the identity value to this parameter. You can read the value from parameter without querying database again.
Also be careful with @@IDENTITY as it may not return the identity value inserted into a specific table which you are expecting. This will behave differently when there are triggers written on the table. Check out @@SCOPE_IDENTITY also which is limited to a scope.
|
|
|
|
|
Don't know if this will be of any help as it is gathered from a stored procedure....
This is (part) of the stored procedure
......
,@NoteField
,@UDField1
,@UDField2
,@UDField3
,@UserName)
DECLARE @NewID int
SET @NewID = SCOPE_IDENTITY()
INSERT INTO [dbo].[CON_tbl_ContactPictures]
([ID]
,[ContPict])
VALUES
(@NewID
,NULL)
SELECT @NewID AS [ID]
I use SCOPE_IDENTITY to make an entry into another table, so to do that I need to make a variable.
When I have done that action the value is the returned to my VB code
'This is a brand new insert so we can get the Contact ID back from it.
dtblData = cDB.GetDataTableFromProc(listParams)
If Not dtblData Is Nothing Then
If dtblData.Rows.Count > 0 Then
Dim drowData As DataRow
drowData = dtblData.Rows(0)
ContactID = drowData("ID")
drowData = Nothing
Else
Please ignore the strange call to get the table and assume this is a normal Fill(DataTable). It would take too long to explain why I have to do it thsis way!!
The important part is the following code after that.
|
|
|
|
|
Um, just a thought. Try
Dim ID As Int32
...instead of Integer
Might work
|
|
|
|
|
I know I should know this, but I can't seem to remember. In Visual Basic, .Net, etc., how do you turn on/off the feature that gives you a list of available functions, methods, attributes, etc. within the text editor where you write your code? For instance, I have a text box named “txtPhoneNum”. When I type “txtPhoneNum.”, right after typing “.”, a list of valid, available items like “enabled”, “selected”, “value”, etc. are displayed where I can select what I want if this feature is on. I don’t know how this feature was turned off, but it would be a great help to get it turned back on. Thanks in advance for assistance.
|
|
|
|
|
Go to 'Tools' then 'Options' and in 'Text Editor' select your language,
or 'All Languages', and turn on the 'Auto list members' option.
|
|
|
|
|
Thanks for your reply. I tried what you wrote and it still doesn't work.
|
|
|
|
|
|
Hi,
I'm using datagridview in C# windows application and i have four datagridtextboxcolumn at designtime and my fifth column is datagridcomboboxcolumn which is added at run time. I want to pass some value ( number) as input to combo at run time, so that values in the combo are different for each row in the grid. I want to pass some number to the fifth combobox column so that combobox populates different values for each row in the grid. This is my scenario, can anyone help me with this with detailed explanation and C# code.
|
|
|
|
|
You might want to try the C# forum? You will probably get a more pertinent explanation than in this (VB) forum.
|
|
|
|
|
1. Wrong forum
2. You can bind the column and set the value member as desired.
The word "politics" describes the process so well: "Poli" in Latin meaning "many" and "tics" meaning "bloodsucking creatures."
|
|
|
|
|
This is the code that calls the form where the file is displayed in a picture box.
<br />
frmCEA.ContactID = intContactID<br />
frmCEA.Text = "Edit a contact"<br />
frmCEA.ShowDialog()<br />
strAvatarToDelete = frmCEA.AvatarForDeletion<br />
frmCEA.Close()<br />
frmCEA.Dispose()<br />
<br />
If strAvatarToDelete.Trim > "" Then<br />
My.Computer.FileSystem.DeleteFile(strAvatarToDelete)<br />
End If<br />
I have tried on the form, and off the form like this, to delete an avatar but every time I get this message - even if I want to change photos.
The process cannot access the file 'C:\Documents and Settings\All Users\Application Data\.....\Avatars\AV000001' because it is being used by another process.
Any out there know why this might be??
|
|
|
|
|
Are there any other methods in your app using the file? If so, you need to cleanly end those resources so that the file is unlocked.
make sure the file is not readonly. Make sure you don't have other apps using the file.
Any suggestions, ideas, or 'constructive criticism' are always welcome.
"There's no such thing as a stupid question, only stupid people." - Mr. Garrison
|
|
|
|
|
Thanks for responding.
No nothing else is using the file. It just gets placed in the picture box:
Try
Me.PictureBox1.BackgroundImage = GetAvatar(ContactID)
Me.cmdDeleteImage.Enabled = True
Catch ex As Exception
Me.cmdDeleteImage.Enabled = False
End Try
Where GetAvatar =
Friend Function GetAvatar(ByVal ContactID As Integer) As Drawing.Image
Dim pict As Drawing.Image
'This just collects a file name
Dim strFilename As String = cDBHandler.ExtractContactImage(ContactID)
Try
If strFilename.Trim > "" Then
pict = Drawing.Image.FromFile(strFileName)
Else
pict = My.Resources.nouserpic_grey
End If
Catch ex As Exception
pict = My.Resources.nouserpic_grey
End Try
Return pict
End Function
Might it be because it ic alled in from another routine??
|
|
|
|
|
Well, if you rem out the logic in GetAvatar and loading it into the picture box, can you delete the file?
Any suggestions, ideas, or 'constructive criticism' are always welcome.
"There's no such thing as a stupid question, only stupid people." - Mr. Garrison
|
|
|
|
|