@zzzzBov Por que esse não foi simplesmente redirecionado para o mais antigo e as melhores respostas foram colocadas lá? Não gosto de um sistema em que uma pergunta que eu faça possa ser encerrada no futuro distante como uma "duplicata" de algo que aconteceu mais tarde. Pelo menos chame isso de algo mais descritivo, como "substituído" em vez de duplicado. O "um" original não pode ser uma duplicata de nada, é o único.
Respostas:
248
/é o separador de caminho nos sistemas Unix e Unix-like. Windows moderno geralmente pode usar tanto \e /de forma intercambiável para filepaths, mas a Microsoft tem defendido o uso de \como separador de caminho ao longo de décadas.
Isso é feito por razões históricas que datam da década de 1970, anteriores ao Windows por mais de uma década. No começo, o MS-DOS (a base do Windows inicial) não suportava diretórios. O Unix tinha suporte de diretório usando o/ personagem desde o início. No entanto, quando os diretórios foram adicionados no MS-DOS 2.0, a Microsoft e a IBM já estavam usando o /caractere para opções de comando e, devido ao analisador leve do DOS (descendente do QDOS , projetado para executar em hardware de ponta), eles não conseguiram encontrar um maneira viável de usar o /personagem sem quebrar a compatibilidade com os aplicativos existentes.
Portanto, para evitar erros sobre "falta de uma opção" ou "opção inválida" ao passar caminhos de arquivo como argumentos para comandos como estes:
cd/<---- no switch specified
dir folder1/folder2 <----/folder2 is not a switchfor dir
foi decidido que o \personagem seria usado em vez disso, para que você pudesse escrever esses comandos como este
cd\
dir folder1\folder2
sem erro.
Posteriormente, Microsoft e IBM colaboraram em um sistema operacional não relacionado ao DOS chamado OS / 2 . O OS / 2 tinha a capacidade de usar os dois separadores, provavelmente para atrair mais desenvolvedores do Unix. Quando a Microsoft e a IBM se separaram em 1990 , a Microsoft pegou o código que eles tinham e criou Windows NT , no qual todas as versões modernas do Windows se baseiam, levando consigo esse agnosticismo separador.
Como compatibilidade com versões anteriores tem sido o nome do jogo para a Microsoft de todas as principais transições de SO que eles realizaram (DOS para Win16 / DOS, Win16 / Win32, Win32 / WinNT), essa peculiaridade ficou emperrada e provavelmente existe por um tempo ainda.
É por esse motivo que essa discrepância existe. Realmente não deve ter efeito no que você está fazendo, porque, como eu disse, o WinAPI geralmente pode usá-los de forma intercambiável. No entanto, aplicativos de terceiros provavelmente serão interrompidos se você passar um /quando eles esperam um \entre nomes de diretório. Se você estiver usando o Windows, fique com \. Se você estiver usando Unix ou URI (que têm como base os caminhos do Unix, mas isso é outra história), use /.
No contexto do C #: Observe que, como essa é tecnicamente uma questão do C #, se você quiser escrever um código C # mais "portátil" que funcione no Unix e no Windows (mesmo que o C # seja predominantemente um idioma do Windows), você convém usar o Path.DirectorySeparatorCharcampo para que seu código use o separador preferido nesse sistema e use Path.Combine()para anexar os caminhos corretamente.
Interessante. Portanto, no DOS ou Windows, foo.exe /barpode ser interpretado como uma opção de linha de comando, enquanto foo.exe \barpode ser interpretado como uma referência a um arquivo / pasta chamado, barlocalizado no diretório raiz \da "unidade" atual, como C:\por exemplo.
Jeppe Stig Nielsen
4
Deve-se notar que essa normalização de /para \ é feita na camada compat Win32, o que significa que, se você contorná-la, haverá uma diferença. O exemplo mais conhecido disso são os caminhos de comprimento estendidos: \\?\C:\ funcionará como esperado no NTFS, mas \\?\C:/não.
Voo
4
@PC ludita: Isso WinAPI pode lidar com ambos /e ` is not entirely true. For network path you have to use `(por exemplo, \\ <servername> bot não // <servername>.)
raznagul
2
@raznagul True. Eu realmente não mencionei caminhos de rede na minha resposta. Fiquei principalmente com o tipo de caminho de arquivo comum. Vou acrescentar isso.
PC Luddite
20
MS-DOS 1.0 manteve a convenção de caracteres da opção de linha de comando (ou opção) de '/' do CP / M. Naquela época, não havia estrutura de diretórios no sistema de arquivos nem conflito.
Quando a Microsoft desenvolveu o ambiente mais semelhante ao Unix com o MS-DOS (e PC-DOS) 2.0, precisou representar o separador de caminho usando algo que não conflitasse com as opções de linha de comando existentes. Internamente, o sistema funciona igualmente bem com '/' ou '\'. O processador de comando (e muitos aplicativos) continuou usando o '/' como caractere de opção.
Uma CONFIG.SYSentrada SWITCHAR=-pode ser usada para substituir o /padrão para melhorar a compatibilidade do Unix. Isso faz com que comandos internos e utilitários padrão usem o caractere alternativo. O separador de caminho do Unix pode então ser usado sem ambiguidade para nomes de arquivos e diretórios. Essa entrada foi removida em versões posteriores, mas uma chamada do DOS foi documentada para definir o valor após a inicialização.
Isso foi pouco usado e a maioria das ferramentas de terceiros permaneceu inalterada. A confusão persiste. Muitas portas das ferramentas Unix mantêm o caractere de switch '-' enquanto algumas suportam ambas as convenções.
O processador de comando subsequente do PowerShell implementa rigorosos parâmetros de escape e comutação e evita amplamente a confusão, exceto onde as ferramentas herdadas são usadas.
Nem a pergunta nem a resposta estão relacionadas ao C #.
Como nota histórica, o uso /como introdutor de opções em vários sistemas operacionais PDP-11, como RSTS (1970) e RSX (1972), precede o de CP / M (1973).
PJTraill
9
Em sistemas baseados em Unix, \há um caractere de escape, isto é, \informa ao analisador que este é um espaço e não o fim da instrução. Em sistemas Unix/ é o separador de diretório.
No Windows \está o separador de diretório, mas /não pode ser usado nos nomes de arquivo ou diretório.
\ e /(assim como vários outros símbolos) não podem ser usados nos nomes de arquivos porque o DOS não possui o mesmo analisador complexo ao qual os usuários do Unix estão acostumados. A falta de um bom analisador foi o resultado de o MS-DOS descender do QDOS ("Sistema operacional rápido e sujo"). O objetivo era fazer com que as coisas funcionassem rapidamente e com hardware limitado. Tudo isso, obviamente, ainda existe nos dias atuais para compatibilidade com versões anteriores.
PC Luddite
2
bem, vale a pena mencionar que nas versões posteriores do Windows /foi adicionado como um "
Diretório_Diretorio_
@PCLuddite talvez devêssemos pensar em compatibilidade com versões futuras?
1
@nocomprende E os caminhos de arquivos são incompatíveis? Incompatível com o que? E como eu disse antes, salvar "alguns aplicativos do DOS" (que eram realmente mais do que milhares) da quebra era realmente importante para os consumidores da época. Foi o que fez a Microsoft ter sucesso hoje e o Unix (e todos os outros realmente) começam a declinar (mesmo que tenha havido um ressurgimento na última década). Não vejo como isso não está sendo encarado com bom senso.
PC Luddite
1
@nocomprende E seu argumento sobre caminhos de arquivo não serem padronizados é completamente nulo. Eles são padronizados no Windows e no Unix. Se você está falando de um padrão de plataforma cruzada, isso não é realmente útil ou fácil de implementar. Quem pode dizer que um padrão é realmente "melhor" que outro?
PC Luddite
8
Uma URL, padronizada na RFC 1738, sempre usa barras, independentemente da plataforma.
Um caminho de arquivo e um URI são diferentes. \está correto no caminho do arquivo do Windows e/ correto no URI.
Vários navegadores (a saber, Firefox e Opera) falham catastroficamente ao encontrar URIs com barras invertidas.
System.IO.Path.DirectorySeparatorChar para obter o separador de caminho atual
Falhar catastroficamente? Firefox traduz \para /automaticamente. No meu livro, isso é chamado de "funciona perfeitamente".
Kroltan 18/07/19
22
minha casa pegou fogo a última vez que eu usei \ no Firefox
user3163495
1
@CarstenS, o Firefox não converte barra invertida em barra automaticamente no URL e não abre o link. Este complemento corrige o URL com barra invertida e página aberta. addons.mozilla.org/pt-BR/seamonkey/addon/…
Sami:
O que exatamente você quer dizer com "falhar catastroficamente"? O que acontece? O navegador trava e sai?
Peter Mortensen
7
Além das respostas dadas, vale ressaltar que \é amplamente utilizado para caracteres especiais (como\n\t ) em linguagens de programação, editores de texto e sistemas gerais que aplicam análise lexical.
Se você estiver programando, por exemplo, às vezes é inconveniente precisar escapar da barra invertida com outra ( \\) para usá-la corretamente - ou usar seqüências de escape, como C #@"\test" .
Obviamente, como mencionado anteriormente, os URIs da Web usam barra padrão por padrão mas as duas barras funcionam nas ferramentas de linha de comando mais recentes e mais comuns.
ATUALIZAÇÃO: Depois de pesquisar um pouco, parece toda a história entre /e \remonta à "história do computador", na era do DOS e dos sistemas baseados em Unix da época. O HowToGeek tem um artigo interessante sobre essa história.
Em resumo, o DOS 1.0 foi lançado inicialmente pela IBM sem suporte a diretório e /foi usado para outra funcionalidade de comando ("comutação"). Quando os diretórios foram introduzidos na versão 2.0, /já estavam em uso, a IBM escolheu o símbolo visualmente mais próximo, que era \. Por outro lado, o Unix é usado normalmente /para diretórios.
Quando os usuários começaram a usar muitos sistemas diferentes, começaram a ficar confusos, fazendo com que os desenvolvedores do sistema operacional tentassem fazer com que os sistemas funcionassem nos dois casos - isso até se aplica à parte dos URLs, pois alguns navegadores suportam o http: \\ www.test. formato com \ go . Isso teve desvantagens, em geral, mas hoje a coisa toda ainda permanece por causas de compartimento atrasado, com uma tentativa de suporte de ambas as barras no Windows, mesmo que elas não sejam mais baseadas no DOS.
"as duas barras funcionam nos caminhos do sistema de arquivos." está incorreto, porque o Unix está bastante zangado quando você usa ` as well as many conchas make` ... você está certo que o Windows recente definiu a variável de ambiente ALTERNATE_PATH_SEPARATOR que o padrão /é o Windows provavelmente pode aceitar os dois.
18716 Tomer W
1
@TomerW O Windows NT sempre foi compatível com POSIX (embora o POSIX anterior estivesse uma bagunça de qualquer maneira, e alguns deles parassem no Windows para compatibilidade com versões anteriores). Isso incluía /caminhos de suporte em todos os lugares do sistema - é claro, os aplicativos podiam entender mal esses caminhos à vontade, por isso não eram muito usados. Aplicativos não CLI que não tentaram fazer sua própria validação (quebrada) de caminhos funcionaram bem desde o início.
Luaan 19/07/19
@Luaan O Windows tinha a capacidade de suportar muitos recursos do POSIX, mas eu dificilmente diria que era "compatível com POSIX". Claro, havia alguns subsistemas POSIX que se podia usar ao longo dos anos, mas esses estavam longe do ideal. O Windows 10 suportará o Ubuntu bash, embora no final deste verão, juntamente com o suporte nativo para as ferramentas Linux que acompanham o Ubuntu, então você poderá argumentar isso no futuro, mas certamente não poderá dizer "sempre".
PC Luddite
@Luaan A menos que "compatível" você queira dizer "cygwin works".
PC Luddite
@PCLuddite Não, era 100% compatível com POSIX.1c. Isso não significa que todos os aplicativos unix funcionam nele - a maioria dos aplicativos unix não é compatível com POSIX :)
Luaan
6
Você não deveria estar usando C #. Você sempre deve usar a Pathclasse . Ele contém um método chamado Path.Combineque pode ser usado para criar caminhos sem especificar você mesmo o separador.
@NikhilVartak, adicionei exemplos, apesar de pensar que minha resposta inicial abordava todas as perguntas do OP.
Ash
3
O Windows também reconhece /nos caminhos (pelo menos 7).
19416 Kenneth K.
Esta resposta está longe de ser completa.
reinierpost
Você deveria criar um link para alguns recursos, além da página principal do Stack Overflow?
Tas
@reinierpost, minha resposta é baseada na pergunta do OP e nas tags associadas. Como algumas das outras respostas aqui, eu poderia copiar algo de stackoverflow.com/questions/1589930/… e colá-lo aqui, mas parecia excessivo. @tas, pretendia vincular à página stackoverflow ou a qualquer hiperlink do site para ilustrar o uso de/ URIs padrão, como afirmei na resposta.
Respostas:
/
é o separador de caminho nos sistemas Unix e Unix-like. Windows moderno geralmente pode usar tanto\
e/
de forma intercambiável para filepaths, mas a Microsoft tem defendido o uso de\
como separador de caminho ao longo de décadas.Isso é feito por razões históricas que datam da década de 1970, anteriores ao Windows por mais de uma década. No começo, o MS-DOS (a base do Windows inicial) não suportava diretórios. O Unix tinha suporte de diretório usando o
/
personagem desde o início. No entanto, quando os diretórios foram adicionados no MS-DOS 2.0, a Microsoft e a IBM já estavam usando o/
caractere para opções de comando e, devido ao analisador leve do DOS (descendente do QDOS , projetado para executar em hardware de ponta), eles não conseguiram encontrar um maneira viável de usar o/
personagem sem quebrar a compatibilidade com os aplicativos existentes.Portanto, para evitar erros sobre "falta de uma opção" ou "opção inválida" ao passar caminhos de arquivo como argumentos para comandos como estes:
foi decidido que o
\
personagem seria usado em vez disso, para que você pudesse escrever esses comandos como estesem erro.
Posteriormente, Microsoft e IBM colaboraram em um sistema operacional não relacionado ao DOS chamado OS / 2 . O OS / 2 tinha a capacidade de usar os dois separadores, provavelmente para atrair mais desenvolvedores do Unix. Quando a Microsoft e a IBM se separaram em 1990 , a Microsoft pegou o código que eles tinham e criou Windows NT , no qual todas as versões modernas do Windows se baseiam, levando consigo esse agnosticismo separador.
Como compatibilidade com versões anteriores tem sido o nome do jogo para a Microsoft de todas as principais transições de SO que eles realizaram (DOS para Win16 / DOS, Win16 / Win32, Win32 / WinNT), essa peculiaridade ficou emperrada e provavelmente existe por um tempo ainda.
É por esse motivo que essa discrepância existe. Realmente não deve ter efeito no que você está fazendo, porque, como eu disse, o WinAPI geralmente pode usá-los de forma intercambiável. No entanto, aplicativos de terceiros provavelmente serão interrompidos se você passar um
/
quando eles esperam um\
entre nomes de diretório. Se você estiver usando o Windows, fique com\
. Se você estiver usando Unix ou URI (que têm como base os caminhos do Unix, mas isso é outra história), use/
.No contexto do C #: Observe que, como essa é tecnicamente uma questão do C #, se você quiser escrever um código C # mais "portátil" que funcione no Unix e no Windows (mesmo que o C # seja predominantemente um idioma do Windows), você convém usar o
Path.DirectorySeparatorChar
campo para que seu código use o separador preferido nesse sistema e usePath.Combine()
para anexar os caminhos corretamente.fonte
Path.Combine
.foo.exe /bar
pode ser interpretado como uma opção de linha de comando, enquantofoo.exe \bar
pode ser interpretado como uma referência a um arquivo / pasta chamado,bar
localizado no diretório raiz\
da "unidade" atual, comoC:\
por exemplo./
para\
é feita na camada compat Win32, o que significa que, se você contorná-la, haverá uma diferença. O exemplo mais conhecido disso são os caminhos de comprimento estendidos:\\?\C:\
funcionará como esperado no NTFS, mas\\?\C:/
não./
e` is not entirely true. For network path you have to use
`(por exemplo, \\ <servername> bot não // <servername>.)MS-DOS 1.0 manteve a convenção de caracteres da opção de linha de comando (ou opção) de '/' do CP / M. Naquela época, não havia estrutura de diretórios no sistema de arquivos nem conflito.
Quando a Microsoft desenvolveu o ambiente mais semelhante ao Unix com o MS-DOS (e PC-DOS) 2.0, precisou representar o separador de caminho usando algo que não conflitasse com as opções de linha de comando existentes. Internamente, o sistema funciona igualmente bem com '/' ou '\'. O processador de comando (e muitos aplicativos) continuou usando o '/' como caractere de opção.
Uma
CONFIG.SYS
entradaSWITCHAR=-
pode ser usada para substituir o/
padrão para melhorar a compatibilidade do Unix. Isso faz com que comandos internos e utilitários padrão usem o caractere alternativo. O separador de caminho do Unix pode então ser usado sem ambiguidade para nomes de arquivos e diretórios. Essa entrada foi removida em versões posteriores, mas uma chamada do DOS foi documentada para definir o valor após a inicialização.Isso foi pouco usado e a maioria das ferramentas de terceiros permaneceu inalterada. A confusão persiste. Muitas portas das ferramentas Unix mantêm o caractere de switch '-' enquanto algumas suportam ambas as convenções.
O processador de comando subsequente do PowerShell implementa rigorosos parâmetros de escape e comutação e evita amplamente a confusão, exceto onde as ferramentas herdadas são usadas.
fonte
/
como introdutor de opções em vários sistemas operacionais PDP-11, como RSTS (1970) e RSX (1972), precede o de CP / M (1973).Em sistemas baseados em Unix,
\
há um caractere de escape, isto é,\
informa ao analisador que este é um espaço e não o fim da instrução. Em sistemas Unix/
é o separador de diretório.No Windows
\
está o separador de diretório, mas/
não pode ser usado nos nomes de arquivo ou diretório.fonte
\
e/
(assim como vários outros símbolos) não podem ser usados nos nomes de arquivos porque o DOS não possui o mesmo analisador complexo ao qual os usuários do Unix estão acostumados. A falta de um bom analisador foi o resultado de o MS-DOS descender do QDOS ("Sistema operacional rápido e sujo"). O objetivo era fazer com que as coisas funcionassem rapidamente e com hardware limitado. Tudo isso, obviamente, ainda existe nos dias atuais para compatibilidade com versões anteriores./
foi adicionado como um "\
está correto no caminho do arquivo do Windows e/
correto no URI.Este pode ser um recurso relevante.
fonte
\
para/
automaticamente. No meu livro, isso é chamado de "funciona perfeitamente".Além das respostas dadas, vale ressaltar que
\
é amplamente utilizado para caracteres especiais (como\n
\t
) em linguagens de programação, editores de texto e sistemas gerais que aplicam análise lexical.Se você estiver programando, por exemplo, às vezes é inconveniente precisar escapar da barra invertida com outra (
\\
) para usá-la corretamente - ou usar seqüências de escape, como C #@"\test"
.Obviamente, como mencionado anteriormente, os URIs da Web usam barra padrão por padrão
mas as duas barras funcionam nas ferramentas de linha de comando mais recentes e mais comuns.ATUALIZAÇÃO: Depois de pesquisar um pouco, parece toda a história entre
/
e\
remonta à "história do computador", na era do DOS e dos sistemas baseados em Unix da época. O HowToGeek tem um artigo interessante sobre essa história.Em resumo, o DOS 1.0 foi lançado inicialmente pela IBM sem suporte a diretório e
/
foi usado para outra funcionalidade de comando ("comutação"). Quando os diretórios foram introduzidos na versão 2.0,/
já estavam em uso, a IBM escolheu o símbolo visualmente mais próximo, que era\
. Por outro lado, o Unix é usado normalmente/
para diretórios.Quando os usuários começaram a usar muitos sistemas diferentes, começaram a ficar confusos, fazendo com que os desenvolvedores do sistema operacional tentassem fazer com que os sistemas funcionassem nos dois casos - isso até se aplica à parte dos URLs, pois alguns navegadores suportam o http: \\ www.test. formato com \ go . Isso teve desvantagens, em geral, mas hoje a coisa toda ainda permanece por causas de compartimento atrasado, com uma tentativa de suporte de ambas as barras no Windows, mesmo que elas não sejam mais baseadas no DOS.
fonte
` as well as many
conchas make` ... você está certo que o Windows recente definiu a variável de ambiente ALTERNATE_PATH_SEPARATOR que o padrão/
é o Windows provavelmente pode aceitar os dois./
caminhos de suporte em todos os lugares do sistema - é claro, os aplicativos podiam entender mal esses caminhos à vontade, por isso não eram muito usados. Aplicativos não CLI que não tentaram fazer sua própria validação (quebrada) de caminhos funcionaram bem desde o início.Você não deveria estar usando C #. Você sempre deve usar a
Path
classe . Ele contém um método chamadoPath.Combine
que pode ser usado para criar caminhos sem especificar você mesmo o separador.Exemplo de uso:
fonte
\
é usado para caminhos de arquivos locais do Windows e caminhos de rede, como em:C:\Windows\Temp\
ou\\NetworkSharedDisk\Documents\Archive\
/
é o que é exigido pelos URIs padrão, como em:http://www.stackoverflow.com/
fonte
/
nos caminhos (pelo menos 7)./
URIs padrão, como afirmei na resposta.