Move file uploads in webform into subdirectory using hook_webform_submission_presave
I finally sorted something out. Now in hook_webform_submission_presave the files are moved into subdirectories named by the value of a number form field. The field is mandatory, so I don't need extra validation in my function.

Here is the code I use in a custom module with plenty of comments, mostly for me to remember what I did.

/**
 * Implements hook_webform_submission_presave().
 *
 * @param $node: The Webform node on which this submission was made
 *        $submission: The Webform submission that is about to be saved to the database
 *
 * - Move uploaded files to subdirectory based on order-id
 */
function custom_module_webform_submission_presave($node, &amp;$submission) {

  if ( 15 == $node-&gt;nid) {
    // get ordernumber for subdirectory
    $subdir = $submission-&gt;data[4][0];
    // get files from submission and move them one by one
    $upload_files = entity_load('file', $ids = $submission-&gt;data[5]);
    foreach ($upload_files as $key =&gt; $file) {
      $uri_old = $file-&gt;uri;
      // find last '/' in URI to get filename
      $uri_break = strrpos($uri_old, '/') + 1;
      // extract filename
      $file_name = substr($uri_old, $uri_break);
      // replace filename in uri with subdirectory to get new directory
      $new_directory = str_replace($file_name, $subdir, $uri_old);
      // if not already exists create subdirectory
      file_prepare_directory($new_directory, FILE_CREATE_DIRECTORY);
      // move file in new directory and show message
      $moved_file = file_move($file, $new_directory, $replace = FILE_EXISTS_RENAME);
      if ($moved_file) {
        drupal_set_message(t('&lt;i&gt;@file&lt;/i&gt; uploaded to server.', array('@file' =&gt; $file_name)));
      }
    }
  }
}