none
загрузка файла по http RRS feed

  • Вопрос

  • Итак, проблема: гружу файл по http вот так:

    async void ConnectToServer_Click(object sender, RoutedEventArgs e)
            {
                var serverAddressField= "http://<servername>/download/packages.txt";
                String fileNameField= "Assets\\download\\packages.txt";
                Uri source = new Uri(serverAddressField.Tri());
                String destination = fileNameField.Trim();
               
                try
                {
                    
                    StorageFile destinationFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri(_baseUri, destination));
                    BackgroundDownloader downloader = new BackgroundDownloader();
                    DownloadOperation download = downloader.CreateDownload(source, destinationFile);
                    download.StartAsync();
                }
                catch (Exception ex)
                {
                    Download.Content = ex.Message.ToString();
                }

    И всё круто конечно. Загружается.
    Только вот дело в том,что для загрузки
    необходимо наличие этого самого файла на диске,куда гружу. То есть у получателя
    должен быть файл packages.txt,чтобы писалось всё в него.

    А можно ли
    как-то обойтись без предварительного создания файла?
    Можно ли,чтобы он как
    бы копировался с сервера?

    И ещё,возможно стоит использовать класс
    WebClient,но моя среда разработки почему-то не видит этот класс,хотя и есть
    запись:

    usingSystem.Net;

    Работаю в Visual Studio 2012; Windows 8.
    Заранее спасибо.

    6 августа 2013 г. 4:48

Ответы

  • Все, наконец понял, в чем у вас проблема. Вы путаете две вещи: приложение в Visual Studio и приложение которое запущенное как Windows Store. У вас приложение выполняется не в папке с проектом. VS устанавливает приложение, так, как будто вы его установили из маркета и просто подключает к нему отладку. Вы можете закрыть VS и по прежнему через кнопку пуск пользоваться своим приложением. Для доступа к папке с запущенным приложением необходимо использовать класс ApplicationData.

    6 августа 2013 г. 12:06
    Отвечающий
  • Добрый день.

    Вы вместо метода GetFileFromApplicationUriAsync используйте метод CreateStreamedFileAsync .

    6 августа 2013 г. 5:10
    Отвечающий
  • Сейчас нет возможности поэкспериментировать. Посмотрите создание файлов здесь. Может и свою проблему решите. Если нет, то вечером попробую. Вы только отпишитесь, получилось или нет.

    6 августа 2013 г. 7:45
    Отвечающий
  • Это особенность Store приложений. Вы можете программно (предаварительно запросив доступ к папке в манифесте) писать только в папки доступные через KnownFolders. Если вам нужно писать в другие папки, то пользователь должен явно задать файл к которому приложение получает доступ через FileOpenPicker. Пример смотрите здесь.

    6 августа 2013 г. 10:58
    Отвечающий
  • Еще раз, у  ApplicationData есть свойство LocalFolder которое позволяет работать с папкой приложения, в том числе получать подпапки, создавать  вних файлы и т.д.

    6 августа 2013 г. 14:37
    Отвечающий

Все ответы

  • Добрый день.

    Вы вместо метода GetFileFromApplicationUriAsync используйте метод CreateStreamedFileAsync .

    6 августа 2013 г. 5:10
    Отвечающий
  • А можно подробней о параметрах этой функции. Что-то я не понял,как её использовать.

    там три параметра.

    1.Имя.(Можно ли тут путь указывать,если мне надо не в текущей папке сохранить?)

    2.Функция,которая будет вызвана при первой обращении к потоку.... Не понятно. Можно ли сделать NULL?

    3.Тут я совсем не понял...что-то про изображение...маска что ли какая-то?

    Не могли бы вы объяснить на моём примере,что там писать?

    6 августа 2013 г. 7:38
  • Сейчас нет возможности поэкспериментировать. Посмотрите создание файлов здесь. Может и свою проблему решите. Если нет, то вечером попробую. Вы только отпишитесь, получилось или нет.

    6 августа 2013 г. 7:45
    Отвечающий
  • Да,отпишусь в любом случае.
    6 августа 2013 г. 8:22
  • делаю так:

    StorageFolder storageFolder =  await StorageFolder.GetFolderFromPathAsync("C:\\Users\\Alex\\Documents\\Visual Studio 2012\\Projects\\animalsC\\animalsC\\bin\\Release\\AppX\\Assets\\download"); //;
                    StorageFile createdFile = await storageFolder.CreateFileAsync("packages.txt");

    Пишет тогда в ex ошибку: "Отказано в доступе." 

    В том примере,который вы дали,человек действует из библиотека документов,а мне надо создать файл в папке "

    Assets\\download\\

    "

    Я вроде уже в манифесте добавил разрешение даже на файлы ".txt".

    Всё равно не выходит.


    Если использовать положение:"KnownFolders.DocumentsLibrary;" , то всё работает. Но мне надо в моей папке создать документ.

    6 августа 2013 г. 8:43
  • Это особенность Store приложений. Вы можете программно (предаварительно запросив доступ к папке в манифесте) писать только в папки доступные через KnownFolders. Если вам нужно писать в другие папки, то пользователь должен явно задать файл к которому приложение получает доступ через FileOpenPicker. Пример смотрите здесь.

    6 августа 2013 г. 10:58
    Отвечающий
  • Тут я порылся и увидел,что можно так сделать:

    StorageFolder storageFolder = await StorageFolder.GetFolderFromPathAsync("C:\\Users\\Alex\\Documents\\Visual Studio 2012\\Projects\\animalsC\\animalsC\\bin\\Release\\AppX\\Assets\\download"); //;
    await storageFolder.CreateFileAsync(filename, CreationCollisionOption.GenerateUniqueName);

    И это работает. Для моих целей достаточно такого,но вот почему-то не получается относительный путь задать. Ошибка выходит...не могу сейчас привести,т.к. уже у другого компа. Но что-то про несоответствие переменной.

    Задаю такой аргумент:

    Assets\\download

    А про выбор FileOpenPicker понять не могу. А как пользователь вообще качает обновление для приложения? Если надо контент обновить. Скачать картинку например с сервера. Пользователь же не будет для каждого файла указывать путь для сохранения.
    Как вообще задачи обновления(скачивания нового) контента решаются в таких приложениях?

    6 августа 2013 г. 11:57
  • Все, наконец понял, в чем у вас проблема. Вы путаете две вещи: приложение в Visual Studio и приложение которое запущенное как Windows Store. У вас приложение выполняется не в папке с проектом. VS устанавливает приложение, так, как будто вы его установили из маркета и просто подключает к нему отладку. Вы можете закрыть VS и по прежнему через кнопку пуск пользоваться своим приложением. Для доступа к папке с запущенным приложением необходимо использовать класс ApplicationData.

    6 августа 2013 г. 12:06
    Отвечающий
  • Завтра попробую.

    Просто у меня получалось открыть существующие файлы,задавая путь именно так: 

    "Assets\\<Имя папки>"


    Смогу ли я здесь сделать так?

    То есть создать файл в такой дирректории?

    И я пробовал формировать пакет и ставить его на своей машине. 

    Там создаётся в Program Files ,в соответствующей директории(не помню названия,но туда видимо ставятся приложения из Store или что-то в этом роде) папка моего приложения и в этой папке есть папка: "Assets\<имя папки>"

    6 августа 2013 г. 13:10
  • Еще раз, у  ApplicationData есть свойство LocalFolder которое позволяет работать с папкой приложения, в том числе получать подпапки, создавать  вних файлы и т.д.

    6 августа 2013 г. 14:37
    Отвечающий
  • Я попробовал.

    Такое дело,эта штука даёт доступ к:

    C:\Users\Alex\AppData\Local\Packages\162f7386-5c82-47a1-aa3c-cfab8985ff2f_cb1hh6\LocalState

    А мне надо получить доступ к:

    C:\Users\Alex\Documents\Visual Studio 2012\Projects\animalsC\animalsC\bin\Release\AppX\Assets\download

    А ,когда приложение установлено,то надо смотреть в эту директорию:

    C:\Program Files\WindowsApps\162f7386-5c82-47a1-aa3c-cfab8985ff2f_cb1hhks6\Assets\download

    Ведь при установке пакета такая папка существует и структура у неё нужная. 

    7 августа 2013 г. 2:23
  • Просто я пытался читать файлы. 

    И при чтении я указывал такой относительный путь:"Assets\download"

    В этом случае программа смотрела  при отладке в директорию:

    C:\Users\Alex\Documents\Visual Studio 2012\Projects\animalsC\animalsC\bin\Release\AppX\Assets\download

    А при установке пакета смотрела в:C:\Program Files\WindowsApps\162f7386-5c82-47a1-aa3c-cfab8985ff2f_cb1hhks6\Assets\download

    7 августа 2013 г. 2:25