I am trying to create a button that uses SystemDialogInput["FileOpen"] to browse for a file and assigns the file name to a variable.

For example:

 {Button["Select the file", fname = SystemDialogInput["FileOpen"]], Dynamic[fname]}


This works most of the time; however, when the file that I browse to is several nested folders away from the default directory, it does not update the value of fname.

Is there some way around this? Or is there a better function to use? I eventually would like to use this button within Manipulate.

-
Try adding the option Method->"Queued" to your Button. –  kguler Feb 22 '13 at 4:23
–  kguler Feb 22 '13 at 4:27

The Method -> "Queued" option is important.
Also do not forget to check file if it is "$Canceled" (in the event of cancellation). Here is an example just copied from one of my programs: Button["Load", file = SystemDialogInput["FileOpen", {NotebookDirectory[] <> "data\\", {"Data files" -> {"*.txt"}}}]; If[ file != "$Canceled", data = Get[file]; ], Method -> "Queued"]