Ah, now I see what you mean. :)
OK, here's what I'm doing: I have a club website, with several non-technical people in charge of maintaining the content of various areas. We have a set of static HTML pages that I maintain, with updates to a "Latest News" page every few weeks. However, for team news, committee minutes, and things like that, it's better for us to have some autonomy and allow different people to upload documents as and when they become available. To allow some degree of navigation, I'm implementing a simple form of augmented browsable directory index page, which associates each uploaded file with a description provided by the responsible person at upload time. To enforce this, and to allow me to restrict the areas that each person can update, I'm distributing a small utility that will be given to different area "owners", so it will be possible to have a 2nd level of special interest document directories. Doing it this way (instead of using a GP FTP client such as SmartFtp) also allows me to encrypt the password.
We have no fine-grained control over our webite hosting, but I do have FTP access for maintaing the content, which works fine for the "main pages" (i.e the content other than the files that the users will be able to upload). The utility I'm developing will use the same FTP access for uploading files. In other words, it runs on client PCs (not on the website server). It already works fine, and dynamically builds the index page; but I'm using streams in the Put/Get API calls, as I was getting errors with the filename overloads of these methods. Being unfamiliar with streams, apart from Filestream classes from my Delphi VCL days, I was finding this a bit heavy going, and quite messy.
I'm interested to know if there's an easy way to get this to work using filenames, but in the meantime I've bound together the uploadable documents with their descriptions in an abstract WebsiteDocument class, which has descendants LocalDocument and RemoteDocument, and I've also added an FTPHelper class, to wrap the Put & Get. With these additional classes, none of my business logic (now there's an exaggeration) has to deal with streams any more, which was my initial concern.