#c# #.net #winforms #webclient
#c# #.net #winforms #webclient
Вопрос:
Я думаю, это просто банальность, и ее довольно легко исправить, в эти дни я действительно расстраиваюсь, потому что всякий раз, когда я нахожу идею для сборки, я всегда сталкиваюсь с какой-то проблемой, либо с чем-то в отделе пользовательского интерфейса, либо с этим для примера.
Я пытаюсь загрузить файл через WebClient, я получил простой пользовательский интерфейс с двумя ярлыками, двумя текстовыми полями, одной кнопкой, виджетом savefiledialog. Когда я пытаюсь сохранить файл, который я ввел в первое текстовое поле 1, и, конечно, нажимаю кнопку, чтобы активировать событие, я получаю webexception «Приложение не может получить доступ к файлу, поскольку он используется другим процессом», но вот сделка, я говорю своему приложению создать файл, сохранить содержимое файла из Интернета в новый файл.
Вы можете прочитать дальше из приведенного ниже кода: Кстати, я ничего не получаю из отладки, я думаю, это странно. Должен ли я переходить к точке останова, поскольку я предполагал, что точка останова будет прерываться в конце строки?
Заранее благодарю.
private void button1_Click(object sender, EventArgs e)
{
string path = saveFileDialog1.FileName;
if (textBox2.Text != "")
{
string fileExt = textBox2.Text.Substring(textBox2.Text.LastIndexOf('.'));
saveFileDialog1.Filter = String.Format("fileExt | *{0}",fileExt);
// http://code.jquery.com/jquery-1.6.1.min.js
string fileName = textBox2.Text.Substring(textBox2.Text.LastIndexOf('/') 1);
saveFileDialog1.FileName = fileName;
DialogResult dResul = saveFileDialog1.ShowDialog();
if (dResul == DialogResult.OK)
{
Debug.WriteLine(client.ResponseHeaders);
//client.UseDefaultCredentials = NetworkCredential;
//client.DownloadDataCompleted = new DownloadDataCompletedEventHandler(client_DownloadDataCompleted);
client.DownloadFileCompleted = new AsyncCompletedEventHandler(client_DownloadFileCompleted);
textBox1.Text = Path.Combine(saveFileDialog1.FileName);
//client.DownloadFileAsync(new Uri(textBox1.Text), saveFileDialog1.FileName);
path = saveFileDialog1.FileName;
Debug.WriteLine(client.ResponseHeaders);
client.DownloadFile(textBox1.Text, Path.Combine(path));
}
}
}
Комментарии:
1. Я не вижу кода, в котором вы «указываете моему приложению создать файл», но предполагая, что в какой-то момент вы используете потоки, вам нужно будет явно вызвать
Close()
их, чтобы освободить файл. Вы также должны вызватьDispose()
в своем диалоговом окне, когда закончите.
Ответ №1:
Убедитесь, что код в client_DownloadFileCompleted не пытается получить доступ к файлу.
Событие DownloadFileCompleted должно использоваться с методом DownloadFileAsync, нет причин использовать события вместе с методами блокировки (DownloadFile).
Ответ №2:
попробуйте это :
удалите textbox2
замените свой код на
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text))
{
return;
}
string extention = Path.GetExtension(textBox1.Text);
string fileName = Path.GetFileNameWithoutExtension(textBox1.Text);
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = String.Format("{0} files | *{0}", extention);
saveFileDialog.FileName = fileName;
if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
WebClient client = new WebClient();
client.DownloadFile(textBox1.Text, saveFileDialog.FileName);
}
}
в текстовом поле 1 введите URL файла, который вы хотите загрузить