Fórum Pegar o caminho de um arquivo #13580
05/01/2010
Boa tarde,
Tenho um webform com um textbox, um botão para procurar um arquivo, e um botão para ler este arquivo.
Quando o usuario clica no botão de procurar, como deveria ser, aparece uma janela para ele selecionar o caminho e o arquivo desejado e dar OK. Quando o arquivo é selecionado e dado OK, o caminho todo aparece na caixa de texto.
Quando eu clico no botão para ler o arquivo, ele deve pegar o caminho do arquivo selecionado, mas está pegando o caminho do projeto do sistema que estou fazendo.
Eu preciso pegar o caminho do arquivo, independente de onde o arquivo esteja.
Como eu faço isso?
Segue o código do que estou utilizando:
protected void Upload_Click(object sender, EventArgs e)
{
// tirar codigo html do nome do arquivo
string fileName = Server.HtmlEncode(MyFile.PostedFile.FileName);
// Para pegar o novo caminho dado
string nomeArq = System.IO.Path.GetFullPath(fileName); <-- AQUI ELE PEGA O CAMINHO DO SISTEMA
// Grava no novo caminho E NÃO O DO ARQUIVO!
MyFile.PostedFile.SaveAs(nomeArq);
cImporta.Principal(nomeArq);
Label1.Visible = true;
}
Posts
Olá João, faça o seguinte.
string caminho = System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName);
"FileUpload1 é o nome do meu FileUpload (que você chama de textbox, mas não, o correto é FileUpload), altere com o nome do seu."
No exemplo acima caso eu selecione um arquivo no meu Desktop a variável caminho irá receber o seguinte valor.
C:\Documents and Settings\f.galante\Desktop
Caso precise dividir o diretório faça o seguinte.
char[] sep = new char[2];
sep[0] = '\\';
sep[1] = '\\';
string[] Directories = System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName).Split(sep);
string DirectoryName = (Directories.Length == 2 && Directories[1].Length == 0) ? Directories[0] : Directories[Directories.Length - 1];
Response.Write("Diretório: <b>" + DirectoryName + "</b>");
Espero ter ajudado
Fabio
A variavel fica vazia:
protected void Upload_Click(object sender, EventArgs e)
{
// tirar codigo html do nome do arquivo
string fileName = Server.HtmlEncode(MyFile.PostedFile.FileName); <-- Aqui o nome do arquivo está certo
// Para pegar o novo caminho dado
string nomeArq = System.IO.Path.GetDirectoryName(fileName); <-- Aqui o valor fica ""
// Grava no novo caminho
MyFile.PostedFile.SaveAs(nomeArq);
cImporta.Principal(nomeArq);
Label1.Visible = true;
}
Você está utilizando UpdatePanel?
Não. não uso o update panel neste webform nao.
Faz assim
string caminho = System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName);
ao invés de
string caminho = System.IO.Path.GetDirectoryName(FileName);
Fabio
Mas você selecionou um arquivo no FileUpload? Caso contrário vem vazio mesmo.
Manda seu aspx e o aspx.cs
Fabio
aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ImportarCI;
using System.IO;
using System.Web.UI.HtmlControls;
public partial class Admin_importaci : System.Web.UI.Page
{
private Class1 cImporta = new Class1();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Upload_Click(object sender, EventArgs e)
{
// tirar codigo html do nome do arquivo
string fileName = Server.HtmlEncode(MyFile.PostedFile.FileName);
// Para pegar o novo caminho dado
string nomeArq = System.IO.Path.GetDirectoryName(MyFile.PostedFile.FileName);
// Grava no novo caminho
MyFile.PostedFile.SaveAs(nomeArq);
cImporta.Principal(nomeArq);
Label1.Visible = true;
}
}
aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="importaci.aspx.cs" Inherits="Admin_importaci" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
</style>
<script language="javascript" type="text/javascript">
function Submit1_onclick() {
}
</script>
</head>
<body>
<form id="form1" runat="server" method="post" enctype="multipart/form-data">
<div>
<table id="TblWebPartes" class="style1" frame="border">
<tr>
<td id="TblCellMenu" class="style5" valign="top" align="center"
bgcolor="#275C76">
<img alt="" src="../Img/CEG.gif" style="width: 230px; height: 65px" /><img
alt="" src="../Img/Titulo.gif" style="width: 530px; height: 65px" /></td>
</tr>
<tr>
<td id="TblCellMenu0" class="style6" valign="top">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:SiteMapDataSource ID="SiteMapDataSourceSCM" runat="server" />
<asp:Menu ID="Menu1" runat="server" BackColor="#B5C7DE"
DynamicHorizontalOffset="1"
Font-Names="Tahoma" Font-Size="Small" ForeColor="#284E98"
Orientation="Horizontal" StaticSubMenuIndent="5px" MaximumDynamicDisplayLevels="10"
StaticDisplayLevels="2" DataSourceID="SiteMapDataSourceSCM"
DynamicVerticalOffset="1" StaticEnableDefaultPopOutImage="False"
Font-Bold="False"
style="border-top-style: solid; border-top-width: 1px; border-bottom-style: solid; border-bottom-width: 1px; padding: 1px">
<StaticSelectedStyle BackColor="#507CD1" />
<StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
<DynamicHoverStyle BackColor="#284E98" ForeColor="White" />
<DynamicMenuStyle BackColor="#B5C7DE" />
<DynamicSelectedStyle BackColor="#507CD1" />
<DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
<StaticHoverStyle BackColor="#284E98" ForeColor="White" />
</asp:Menu>
</td>
</tr>
<tr>
<td id="TblCellMenu1" class="style3" valign="top">
<p style="margin-bottom: 3px">
<span class="style7">Ol,
</span>
<asp:LoginName ID="LoginName1" runat="server" CssClass="style7" />
<span class="style7">!
</span>
<asp:LoginStatus ID="LoginStatus1" runat="server"
LogoutPageUrl="~/login.aspx" LogoutAction="RedirectToLoginPage"
CssClass="style7" />
<br class="style7" />
<span class="style7">Acesso de Administrador</span></p>
<p align="center" lang="pt-br"
style="font-weight: bold; margin-top: 3px; margin-bottom: 3px;"
class="style8">
IMPORTAO DO CI</p>
<p style="border-top: thin solid #336699; margin-top: 0px; margin-bottom: 7px; padding-bottom: inherit;"
class="style9">
<span class="style10">Localize o arquivo txt:</span> </p>
<br>
<%-- A button - when clicked the form is submitted and the
Upload_Click event handler is fired... --%>
<input id="Submit1" type="Submit" value="Iniciar Importao"
OnServerClick="Upload_Click" RunAt="server" onclick="return Submit1_onclick()" /><asp:Label
ID="Label1" runat="server" ForeColor="Red"
style="z-index: 1; left: 162px; top: 290px; position: absolute; right: 325px; height: 21px; font-size: medium; font-family: Verdana;"
Text="Importao efetuada com sucesso !!!" Visible="False"
Font-Bold="False"></asp:Label>
<input ID="MyFile" type="file" RunAt="server" size="80"/><p>
</p>
<p>
</p>
</td>
</tr>
<tr>
<td id="TblCellRodape" align="center" class="style4">
<p class="style9">
CEG, CEG RIO, GNSPS
</p>
</td>
</tr>
</table>
</div>
</form>
<%-- The Web Form with the EncType property set to Multipart/Form-Data --%>
</body>
</html>
João funcionou. Você está selecionando o arquivo? Veja abaixo que estou imprimindo o caminho da minha máquina.
C:\Documents and Settings\f.galante\Meus documentos\DevMedia.txt
C:\Documents and Settings\f.galante\Meus documentos
Importao efetuada com sucesso !!!
protected void Upload_Click(object sender, EventArgs e)
{
// tirar codigo html do nome do arquivo
string fileName = Server.HtmlEncode(MyFile.PostedFile.FileName);
Response.Write(fileName + "<br>");
// Para pegar o novo caminho dado
string nomeArq = System.IO.Path.GetDirectoryName(MyFile.PostedFile.FileName);
Response.Write(nomeArq);
// Grava no novo caminho
//MyFile.PostedFile.SaveAs(nomeArq);
//cImporta.Principal(nomeArq);
Label1.Visible = true;
}
estranho... continua não vindo nada...
voce executou debugando, ou publicou e executou publicado?
deu erro nesta linha em vermelho:
protected void Upload_Click(object sender, EventArgs e)
{
// tirar codigo html do nome do arquivo
string fileName = Server.HtmlEncode(MyFile.PostedFile.FileName);
Response.Write(fileName + "<BR>");
// Para pegar o novo caminho dado
string nomeArq = System.IO.Path.GetDirectoryName(MyFile.PostedFile.FileName);
Response.Write(nomeArq);
// Grava no novo caminho
MyFile.PostedFile.SaveAs(nomeArq); <-- O método SaveAs está configurado para exigir um caminho com raiz, e o caminho '' não tem raiz.
cImporta.Principal(nomeArq);
Label1.Visible = true;
}
Revendo o seu aspx eu vejo que utiliza um
<input ID="MyFile" type="file" RunAt="server" size="80"/>
Troca para um FileUpload
<asp:FileUpload ID="FileUpload1" runat="server" />
Em seguida crie uma pasta chamada documentos e segui a exemplo abaixo, veja que irá funcionar.
// tirar codigo html do nome do arquivo
string fileName = Server.HtmlEncode(FileUpload1.PostedFile.FileName);
Response.Write(fileName + "<br>");
// Para pegar o novo caminho dado
string nomeArq = System.IO.Path.GetDirectoryName(FileUpload1.PostedFile.FileName);
Response.Write(nomeArq);
// Grava no novo caminho
//Aqui eu salvo o arquivo na pasta Documentos na raiz do meu projeto.
FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Documentos/") + FileUpload1.FileName);
//cImporta.Principal(nomeArq);
Label1.Visible = true;
Consegui de outra forma.
protected void Upload_Click(object sender, EventArgs e)
{
// tirar codigo html do nome do arquivo
string fileName = Server.HtmlEncode(FileUpload1.PostedFile.FileName);
// Para criar o novo caminho do arquivo
string nomeArq = Server.MapPath("~/Documentos/") + FileUpload1.FileName;
// Grava no novo caminho
//Aqui eu salvo o arquivo na pasta Documentos na raiz do meu projeto.
FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Documentos/") + FileUpload1.FileName);
cImporta.Principal(nomeArq);
Label1.Visible = true;
}
eu defini a pasta para guardar o arquivo e salvei este caminho numa string.
depois eu utilizo o metodo que eu preciso, para importação e processamento das informações, com a string que possui o caminho certo.
parece que deu certo.
só falta testar no cliente.
Obrigado.
João assim que você tiver o resultado avise por favor para que eu possa fechar o chamado.
Obrigado.
deu certo, muito obrigado.