ASP clássico VBScript / - Existe alguma maneira de obter o seu próprio nome de arquivo por meio de programação?

StackOverflow https://stackoverflow.com/questions/450552

  •  19-08-2019
  •  | 
  •  

Pergunta

Eu estava revendo alguns códigos antigos e encontrou o seguinte (foo.asp dentro):

Const ASP_FILENAME = "foo.asp"  ' TODO: Update this to the name of this file (if changed)

A variável é utilizada apenas para erros de registro. (Ie. "Erro na foo.asp -. Não foi possível criar objeto xxxxx") Existe alguma maneira de evitar isso?

Obrigado!

Foi útil?

Solução

A partir do Aspfaq.com agora extinta (graças a Archive.org ):

Como posso obter o nome do URL / página atual?

Este é bastante fácil, mas há duas partes.

Para obter o nome do arquivo atual, você pode usar qualquer um destes:

<% 
    Response.Write Request.ServerVariables("SCRIPT_NAME") & "<br>" 
    Response.Write Request.ServerVariables("PATH_INFO") & "<br>" 
    Response.Write Request.ServerVariables("URL") & "<br>" 
%>

Para fazer esse caminho local (por exemplo, para usar com FileSystemObject), basta aplicar o método server.mappath () para o resultado.

Para obter o URL inteiro, incluindo o http: // ou https: // prefixo, você pode fazer isso:

<% 
    prot = "http" 
    https = lcase(request.ServerVariables("HTTPS")) 
    if https <> "off" then prot = "https" 
    domainname = Request.ServerVariables("SERVER_NAME") 
    filename = Request.ServerVariables("SCRIPT_NAME") 
    querystring = Request.ServerVariables("QUERY_STRING") 
    response.write prot & "://" & domainname & filename & "?" & querystring 
%>

Para obter o nome da página apenas, uso algo como isto:

<% 
    scr = Request.ServerVariables("SCRIPT_NAME") & "<br>" 
    if instr(scr,"/")>0 then 
        scr = right(scr, len(scr) - instrRev(scr,"/")) 
    end if 
    response.write scr 
%>

Ou, sem a lógica IF:

<% 
    scr = Request.ServerVariables("SCRIPT_NAME") & "<br>" 
    loc = instrRev(scr,"/") 
    scr = mid(scr, loc+1, len(scr) - loc) 
    response.write scr 
%>

Agora. Se o arquivo é um # include dentro de outro arquivo, os scripts acima irá produzir o nome do arquivo de chamada (desde que o arquivo incluído é primeiro integrado no roteiro chamado, então o ASP dentro de tudo é executado no contexto do 'pai ' Arquivo). Uma maneira que você pode contornar essa é a re-preencher uma variável current_filename antes de carregar cada arquivo de inclusão, por exemplo:

<% 
      current_filename = "filetoinclude.asp" 
 %> 

<!--#include file='filetoinclude.asp'-->

(E não, não tente passar current_filename como uma variável para a directiva # include;. Ver artigo # 2042)

Então, em filetoinclude.asp:

<% 
    Response.Write "Current file: " & current_filename 
%>

Claro, você poderia facilmente codificar o interior nome de cada arquivo de inclusão. Mas suponho que a solução seria um pouco derrotar o propósito de recuperar essa informação pelo menos um pouco de forma dinâmica.

Outras dicas

Você pôde analisar Request.ServerVariables("url") para obter a parte nome do arquivo. Uma pesquisa no google encontrada este código , para o qual i não direito de crédito, que usa a variável de servidor SCRIPT_NAME que parece fazer mais sentido, na verdade, também de tomar qualquer url reescrever na conta que pode ser posto em prática:

function getFileName(fpath, returnExtension)
        tmp = fpath
        if instrRev(tmp,"/") > 0 then
              tmp = mid(tmp, instrRev(tmp,"/")+1)
        end if
        if returnExtension = false then
              if instrRev(tmp,".") > 0 then
                    tmp = left(tmp, instrRev(tmp,".")-1)
              end if
        end if
        getFileName = tmp
  end function

  filename = request.ServerVariables("SCRIPT_NAME")
  Const ASP_FILENAME = getFileName(filename, true)

Eu não sei se server.mappath existe no asp tradicional, mas se assim for, você poderia usar se de saber o nome do arquivo página.

Não estou dizendo que alguém aqui [inserir discreta tosse pigarro aqui] ainda usa ASP clássico para manter e suportar aplicações legadas, mas recentemente tive a necessidade de fazer algo similar. Recusando-se a se contentar com o "É impossível com ASP clássico" respostas lá fora, me propus a encontrar um caminho e veio com a seguinte solução.

Esta abordagem basicamente utiliza comandos de sistema operacional subjacente para literalmente determinar o nome do arquivo atual (cujo resultado é equivalente a usar a constante __FILE__ mágica em PHP), independentemente de se tratar de um arquivo de inclusão (*.inc) ou o script si (*.asp).

Em primeiro lugar, para apoiar alguns sanitização (você pode fazer isso maneira alguma outra mais "ideal" se desejar):

'Regex helpers
Function NewRegex(ByVal pattern, ByVal ignore_case, ByVal global)
  Set NewRegex = New RegExp
  NewRegex.Pattern = pattern
  NewRegex.IgnoreCase = ignore_case
  NewRegex.Global = global
End Function

Function RegexMatch(ByVal pattern, ByVal subject)
  RegexMatch = RegexMatches(subject, pattern, True, False)
End Function

Function RegexMatches(ByVal subject, ByVal pattern, ByVal ignore_case, ByVal global)
  RegexMatches = NewRegex(pattern, ignore_case, global).Test(subject)
End Function

E agora para um tempo de "reflexão:"

Function GetCurrentFilename(ByVal uniqueId)
  '1. Enforce uniqueId format
  If Not RegexMatch("^[0-9a-f]+$", uniqueId) Then
    Exit Function
  End If

  '2. Use findstr to scan "readable" files in current directory for uniqueId
  Dim shell, cmd, process, fs, filename
  Set shell = Server.CreateObject("WScript.Shell")

  'See findstr /? for details on switches used below
  'cmd = C:\Windows\system32\cmd.exe /c findstr /P /M /C:"uniqueId" "C:\Inetpub\wwwroot\includes\*"
  cmd = shell.ExpandEnvironmentStrings("%COMSPEC%") & " /c findstr /P /M /C:""" & uniqueId & """ """ & Server.MapPath(".") & "\*"""
  Set process = shell.Exec(cmd)

  '3. Use Scripting.FileSystemObject to return the filename portion of the first result returned
  Set fs = Server.CreateObject("Scripting.FileSystemObject")
  GetCurrentFilename = fs.GetFileName(process.StdOut.ReadLine())

  Set fs = Nothing
  Set process = Nothing
  Set shell = Nothing
End Function

Então, dentro de qualquer arquivo que você quer "inspecionar" o nome do arquivo atual, basta soltar a seguinte linha, passando em algum identificador único que não deveria existir em qualquer outro arquivo no diretório atual, mas esta:

'myfile.inc
Response.Write "This is in " & GetCurrentFilename("908ab098c")

O resultado:

This is in somefile.inc

Ah, e se você estiver interessado no que eu precisava usar isso para, aqui está o que parece utilizado em uma função ponto de interrupção simples:

Function Breakpoint(ByVal line_no, ByVal uniqueId, ByVal msg)
  Dim fn
  fn = GetCurrentFilename(uniqueId)

  Response.Write "[!] Breakpoint hit at Line " & CLng(line_no) & " in " & fn & ": " & Server.HtmlEncode(msg) & vbNewLine
  Response.End
End Function

De tal forma que, na Linha 20 do meu código, se eu queria para adicionar meu próprio ponto de interrupção, ele ficaria assim:

Breakpoint 20, "B0001", "Some debug output here"

Output:

[!] Breakpoint hit at Line 20 in somefile.inc: Some debug output here

Happy codificação!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top