http://gparted.sourceforge.net/livecd.php
On XP, I had to be sure to turn off "hibernation" and "virtual memory" before running defragment. Those two files are unmovable. Once you turn it off and defrag, it should move everything to the front of the disk. Then you can safely resize the partition.
After the resize, you can re-enable virtual memory and hibernation (if you use hibernation).
I have never done this with Vista and I am assuming that Vista will behave the same way as XP...