如何在Visual Studio中重命名项目文件夹?


685

我当前用于重命名项目文件夹的解决方案是:

  • 从解决方案中删除该项目。
  • 重命名Visual Studio外部的文件夹。
  • 将项目重新添加到解决方案中。

有没有更好的办法?


4
没有简单的一键式操作方式。无论如何,不​​是在Visual Studio中。
马特·汉森,

11
有谁知道微软是否会为2010版本修复此问题?
维达尔

29
显然不是,因为已经过了三年,我只需要经历安德斯延米尔的过程。:)
sichinumi 2012年


2
显然投票失败了,因为2018年仍不支持该功能。不更改文件需要多少GB?显然是17GB。17.
约瑟夫·弗朗西斯

Answers:


746

TFS用户:如果您使用的源代码管理要求您在重命名文件/文件夹之前发出警告,则请查看此答案,它涵盖了所需的额外步骤。


要在Visual Studio中重命名项目的文件夹文件.*proj)和显示名称,请执行以下操作:

  • 关闭解决方案。
  • 重命名Visual Studio外部的文件夹。(如果使用源代码管理,则在TFS中重命名)
  • 打开解决方案,忽略警告(如果要求从源代码管理中加载项目,请回答“否”)。
  • 经历所有不可用的项目并...
    • 打开项目的属性窗口(突出显示该项目,然后按Alt+ EnterF4,或右键单击> properties)。
    • 将属性“ File Path ”设置为新位置。
      • 如果该属性不可编辑(如在Visual Studio 2012中一样),则.sln直接在另一个编辑器(如Notepad ++)中打开文件,并在那里更新路径。(您可能需要先在TFS中检出解决方案,等等。)
    • 重新加载项目-右键单击>重新加载项目。
    • 通过突出显示项目并按来更改项目的显示名称F2,或右键单击> 重命名

注意:其他建议的解决方案包括删除项目,然后将其重新添加到解决方案中,将破坏项目引用。

如果执行这些步骤,则可能还会考虑重命名以下内容以使其匹配:

  1. 部件
  2. 默认/根命名空间
  3. 现有文件的命名空间(使用Visual Studio中的重构工具或ReSharper不一致的命名空间工具)

还可以考虑修改以下程序集属性的值:

  1. AssemblyProductAttribute
  2. AssemblyDescriptionAttribute
  3. AssemblyTitleAttribute

24
对于那些使用源代码管理的用户,我认为您也需要在源代码管理中重命名该文件夹。对我来说,上述步骤没有这样做。
Patrick Szalapski 2010年

10
使用TFS时,实际上是在源代码管理中重命名文件夹,然后在重新打开sln之前获取最新版本。
艾米·帕特森

3
重命名文件夹后,“文件路径”属性在VS2010中变得可编辑(并且VS无法找到项目)
Jimmy

11
在VS 2012中,这对我不起作用。该属性为只读。我必须打开.sln文件作为文本。
Grault

3
kes!这一切麻烦重命名文件夹!在MS-DOS中这更容易!
Kokodoko

96

使用* .sol,* csproj文件还有另一种方法。

  1. 打开您的解决方案文件。
  2. 搜索您要更改的* .csproj。
  3. 就像这样(相对于* .sol文件):

    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shani.Commands.Impl", "Shani.Commands.Impl\Shani.Commands.Impl.csproj", "{747CFA4B-FC83-419A-858E-5E2DE2B948EE}"

  4. 只需将第一部分更改为新目录,例如:

    Impl\Shani.Commands.Impl\Shani.Commands.Impl.csproj

  5. 当然,不要忘记将整个项目移到该目录。


16
这对我有用,而不是被接受的答案,它不起作用,因为FilePath属性对我来说是只读的。
TJKjaer 2013年

1
谢谢,这很有帮助。另外,还要确保更改RootNamespace和AssemblyName值。
DevDave

@TJKjaer一样。
dzenesiz

这在VS2019中对我不起作用。发出有关项目引用不存在的警告,并编译有关缺少引用项目中的名称空间和类的错误。
杰夫·沃克

这适用于Visual Studio 2019中的C#项目。这是一个相当简单的解决方案。对于尝试编译时可能遇到问题的人,我建议您完全重建项目,而不是仅编译。
席尔瓦

94

这在Visual Studio 2015中非常简单(可能在较早版本中有效)

  1. 在解决方案资源管理器中,右键单击主要解决方案重命名
  2. 在解决方案资源管理器中,右键单击项目(在解决方案下)→ 重命名
  3. 在解决方案资源管理器中,双击或右键单击属性 →转到应用程序选项卡,重命名程序集名称默认名称空间以进行匹配。
  4. 如果您还希望重命名名称空间,请打开您的一个类文件。右键单击命名空间→ 重命名...。这将搜索并替换整个项目中对您的名称空间的所有引用。
  5. 关闭项目→重命名项目文件夹
  6. .sln记事本中编辑文件,然后更改csproj的路径,即fu\bar.csprojbar\bar.csproj

3
您忘记更新相关项目中的项目引用(如果有)。
史蒂文·里肯斯

1
@JohnPeters据我所知,此答案尚未编辑。步骤5描述了文件夹的重命名,因此遵循这些步骤确实确实也更改了物理文件夹名称。
菲利普·斯特拉特福德

记住将步骤4应用于子项目文件夹(这是我唯一缺少的步骤,因此步骤6可以正常工作)。
费利佩·古铁雷斯

54

伙计,我为此感到挣扎吗?不幸的是,Visual Studio中没有一键式解决方案,但是如果您运行的是Visual Studio 2012,并且您的项目处于Team Foundation Server的源代码控制之下,则可以在保持源代码历史记录的同时,通过以下方法来使其工作:

(确保您阅读了以下@mjv的评论,因为他指出您可以跳过第5-10步)

  1. 确保已签入所有更改,因此没有任何待处理的更改。
  2. 右键单击并选择删除,从解决方案中删除项目。
  3. 现在,在Windows资源管理器中,重命名项目文件夹。
  4. 返回到Visual Studio,然后在解决方案资源管理器中,右键单击解决方案,然后选择添加 -> 现有项目。选择在步骤2中删除的项目的项目文件,该文件应位于重命名的文件夹中。
  5. 现在,该项目又回到了解决方案中,但是该项目似乎没有添加到源代码管理中。要解决此问题,请打开“源代码管理资源管理器”。
  6. 在源代码管理资源管理器中找到与您的磁盘上的项目文件夹相对应的项目文件夹,该文件夹在步骤3中已重命名。
  7. 在Source Control Explorer中重命名该文件夹,使其与磁盘上的项目文件夹具有相同的名称。
  8. 现在看看您即将进行的更改。您应该对解决方案文件进行更改,并在项目文件夹上进行重命名操作。
  9. 进行重建,并确保所有内容都能正确编译。如果您对重命名的项目有项目间引用,则需要再次将它们添加到引用它的单个项目中。
  10. 您应该已经准备就绪。去检查所有东西。

上面的指南对我有用。如果它不适合您,请尝试完全删除本地解决方案,然后删除工作空间中的文件夹映射。重新启动Visual Studio,以防万一。确保您实际上从计算机上删除了整个解决方案。现在,阅读解决方案映射到您的工作区并获取最新版本。现在尝试上述步骤。如果在执行上述步骤时出现问题,则同样适用。只需在本地删除您的解决方案并获取最新资源,便可以使用。

如果仍然有问题,请确保在尝试上述步骤之前,没有手动更改解决方案文件中的任何内容,或尝试其他“技巧”。如果您更改了某些内容并检入了它,则可能要考虑在回滚项目重命名之前进行回滚。

当然,您还想在解决方案资源管理器中重命名项目本身。您可以在执行上述步骤之前执行此操作,但是在这种情况下,请确保在应用上述步骤之前先签入该更改。您也可以在此之后执行此操作,但是请确保先执行上述所有步骤,然后在尝试在解决方案资源管理器中重命名项目名称之前检查所做的更改。我不建议尝试将以上步骤与在解决方案资源管理器中重命名项目名称混在一起。虽然可能可行,但我建议在2个单独的变更集中进行。


10
感谢您介绍可用于的程序VS2012!请注意您可能避免步5-10(即具有带回源控件中的文件夹重命名)中相反,如果你关闭该解决方案,然后重命名文件夹VS' Source Control Explorer,而不是Windows Explorer
mjv

2
这些步骤已关闭,但是在Source Control Explorer(SCE)中重命名之前使用Windows Explorer(WE)更改文件夹位置会导致错误:Folder already exists。因此,我不得不重新命名该文件夹,WE然后在中对其进行更改SCE,然后将文件复制到该文件夹​​中,然后才能起作用。因此,请遵循上面mjv的评论。我也没有想到需要更改实际的项目文件名(不仅仅是在VS中),这是我事后才想到的,使我重复了其中一些步骤。
CaptainBli 2014年

这种带有mjv注释的方法在Perforce中也可以通过右键单击“重命名/移动”选项来使用。
桑托斯2014年

您可以避免破坏项目参考,请参见stackoverflow.com/a/10853509/10245
Tim Abell,2014年

@TimAbell您是否在VS2012中尝试了该过程,对您有用吗?在我最初写答案之前,我已经尝试过了,但是它对我不起作用,因为“属性”窗口中的“项目路径”始终是只读的。而且编辑SLN文件也不起作用。
勒内(René)2014年

33

目前没有 好吧,实际上,您可以单击损坏的项目节点,然后在属性窗格中查找属性“ Path”,单击小的浏览图标,然后选择新路径。

Voilà:)


2
使用VS2015,“已卸载项目属性”属性名称为“文件路径”,并且该值既不可编辑也不可浏览。
威廉

29

以下是更简单的解决方案:

  1. 右键单击该项目并重命名。
  2. (可选)打开项目的属性设置,并修改程序集名称(以及可选的默认名称空间)以使用新的项目名称。
  3. (可选)在源文件中选择名称空间名称,右键单击并选择“ 重构 / 重命名”以将名称空间全局重命名为新项目名称。
  4. (可选)打开AssemblyInfo.cs文件并更改程序集名称以使其匹配。
  5. 保存并关闭解决方案。
  6. 使用Windows资源管理器,将项目文件夹重命名为新名称。
  7. 在文本编辑器中打开SLN文件,找到对项目路径的一个引用,并将其更改为使用新的文件夹名称。

需要四个步骤,但建议七个。最终,尽管项目已被完全重命名。从技术上讲,项目的文件夹名称不必与项目本身匹配,因此即使该步骤也是可选的,但是如果它们不匹配,可能会造成混淆。程序集和名称空间名称相同。


备用步骤7:使用VS打开SLN文件,忽略警告(单击“确定”),在解决方案资源管理器中选择项目,单击F4,更新文件路径。可选步骤0:右键单击解决方案并重命名。
Martin Schneider

6
微软做某事有多么令人难以置信
Alex

1
这在Visual Studio Community 2017上对我有用。接受的答案对我不起作用;对于我来说,需要更改的属性是只读的,并且无法在属性对话框中进行更改。
codingatty

10

Andersjanmyr的答案来说,首先更容易重命名项目。

  1. 重命名项目。
  2. 关闭解决方案(保存)。
  3. 重命名Visual Studio外部的文件夹。
  4. 打开解决方案,忽略警告。
  5. 浏览所有不可用的项目,并将属性“文件路径”设置为项目文件的新位置,即someproject.csproj
  6. 重新加载项目。

同样,在执行了这些步骤之后,您可能希望将其他引用重命名为您的旧项目名称。

在项目属性中,更新程序集名称和默认命名空间。

这将更新项目文件中的以下内容...

<RootNamespace>SomeProjectName</RootNamespace>
<AssemblyName>SomeProjectName</AssemblyName>

...并将摆脱错误“名称空间与文件位置不对应,应为:'SomeProjectName'”

重命名您的根名称空间(如果您拥有ReSharper,请右键单击“名称空间”,然后转到“重构”->“重命名”)。

更改AssemblyInfo.cs中所有出现的旧项目名称。


基于此答案,您可以手动编辑解决方案文件,以使项目路径是您的新路径,并避免在打开解决方案时发出警告。您可能可以单击“项目”>“属性”>“ AssemblyInfo”来从VS中编辑程序集信息,并避免编辑AssemblyInfo.cs文件。
H2ONaCl 2014年

8

对于Visual Studio 2017,您可以使用我的Visual Studio扩展名:

下载

它将在以下位置重命名该项目:

  • 项目位置文件夹
  • 解决方案文件
  • 其他项目中的参考
  • 程序集名称,信息
  • 默认名称空间

太棒了!厌倦了我过去必须做的所有手动重命名。效果很好。但是,在另一个包中找不到字符串引用。不知道这是否是故意的。
frostymarvelous

谢谢。但我不理解以下内容:“另一个包中的字符串引用”。你能解释一下吗?
Kuanysh

所以我有一个测试项目,我也有[assembly: InternalsVisibleTo("MyTests")]。当我重命名时MyTests,它没有重命名该引用。同样,我不认为这属于您的权限,并且很容易手动解决。
frostymarvelous

1
此扩展名假设文件夹当前与项目具有相同的名称(重命名之前)。如果它们不同,则重命名失败:(我也没有得到“重命名空间”的作用。幸运的是,我只在很小的解决方案上使用了它。否则,太好了!
savehansson

1
@MassimilianoKraus我将扩展名设为私有,因为最近的负面评论没有在市场上进行解释。对此表示抱歉。我已经更新了链接
Kuanysh

6

我只需要自己做(使用Visual Studio 2010)。正如一些人回答的那样,最简单的步骤似乎是:

  1. 关闭Visual Studio项目。
  2. 打开.sln文件,并为每个.csproj事件重命名项目目录前缀。
  3. 保存.sln文件
  4. 重命名您的硬盘上的实际项目文件夹目录,以匹配您对.sln文件所做的更改。
  5. 打开.sln(在Visual Studio中)并重建

5

对于那些使用Visual Studio + Git并希望保留文件历史记录的人(可以重命名项目和/或解决方案):

  1. 关闭Visual Studio

  2. 在.gitignore文件中,将要重命名的项目的所有忽略路径复制到这些路径的重命名版本中。

  3. 像这样使用Git move命令:

    git mv <old_folder_name> <new_folder_name>
    

    请参阅文档以了解其他选项:https : //git-scm.com/docs/git-mv

  4. 在您的.sln文件中:找到定义项目的行,然后在path中更改文件夹名称。该行应类似于:

    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "<Project name>", "<path-to-project>\<project>.csproj"
    
  5. 打开Visual Studio,然后右键单击项目→ 重命名

  6. 之后,重命名名称空间。

    我读到ReSharper为此提供了一些选择。但是简单的查找/替换为我完成了工作。

  7. 删除旧的.gitignore路径。


4

请参阅链接文章中的项目3


  1. 关闭解决方案和IDE。
  2. 在Windows资源管理器中:将目录名称更改为新名称。
  3. 在Windows资源管理器中:使用文本编辑器打开.sln文件。
  4. 将目录名称更改为新名称并保存。
  5. 重新启动IDE,并从菜单“ 文件” →“ 最近的文件”菜单中打开解决方案(如果该解决方案无法自动启动)。
  6. 单击解决方案资源管理器中的项目文件夹,然后在底部的属性中检查path属性。现在它将引用新的项目文件夹。

它为我工作。


4

在Visual Studio 2017中对我有用的是:

  • 在Visual Studio中关闭解决方案
  • 重命名解决方案中的项目目录。
    • (在源代码控制中进行更改-在我的情况下为Git)
  • 在文本编辑器中(Visual Studio 2017外部)编辑.sln文件,更改目录名称。
  • 重新打开Visual Studio中的解决方案

它说类似“ 重新添加项目 ”。我重建了一切,一切顺利。


1
另外,您可能需要从其他项目的依赖项中删除旧项目,然后将新重命名的项目重新添加为新的依赖项(右键单击旧项目>>删除,然后右键单击Dependencies>> Add reference>>选择新项目)
maxshuty

4

我不得不做很多次。能够重新利用现有项目,但能够重命名名称空间,文件和文件夹(包括文件/目录名称)中的文本,这确实很有用。

从根文件夹开始使用递归查找和替换意味着重命名不会中断解决方案文件和项目引用中项目的链接。

为此,我创建了一个项目来完成此任务。该应用程序还努力忽略版本控制文件夹,例如.git,.svn和.vs设置文件。更多信息在自述文件中。

https://github.com/garethrbrown/vs-project-rename

例


2
干得好!您的项目实际上是一个重命名工具。我认为确实缺少一件事:全字匹配选项。
伊利亚胡·亚伦

4

一个经过验证的Visual Studio扩展解决方案,用于商业智能数据工具(SSDT-BI 2013):

  1. 将项目文件夹移动到新位置(尚未重命名)
  2. 在解决方案资源管理器中,重命名项目/解决方案。
  3. 关闭(并保存)新重命名的项目。
  4. 重命名项目的文件夹和.sln文件。
  5. 使用文本编辑器并打开新重命名的项目解决方案文件(.sln)(我使用Notepad ++
  6. 在第6行中,您将看到:“ Project {fdjfksdjk4387!...} =” OLDPROJECT“,” OLDFOLDER \ OLDPROJECT.rptproj“。使用在步骤4中使用的新名称重命名所有内容。(即... =” NEWPROJECT ”,“ NEWFOLDER \ NEWPROJECT.rptproj” ...)
  7. 而已!

经过100%的测试,在我的情况下可以完美地工作。

注意:我无法确认它是否可以在不同的项目模板和其他Visual Studio版本下工作。与往常一样,请事先备份所有内容。



2

我经常遇到相同的问题,即在Visual Studio中重命名项目并编辑文件夹名称,项目名称和.sln文件以实现此目的。我只是编写了一个VBScript脚本来完成所有这些工作。您必须小心选择要替换的字符串。

您只需要将.vbs文件与解决方案的.sln文件放在同一目录中即可。

' Script parameters'
Solution = "Rename_Visual_Studio_Project" '.sln'
Project = "Rename_Visual_Studio_Project" '.csproj'
NewProject = "SUCCESS"

Const ForReading = 1
Const ForWriting = 2

Set objFso = CreateObject("Scripting.FileSystemObject")
scriptDirr = objFso.GetParentFolderName(wscript.ScriptFullName)

' Rename the all project references in the .sln file'
Set objFile = objFso.OpenTextFile(scriptDirr + "\" + Solution + ".sln", ForReading)
fileText = objFile.ReadAll
newFileText = Replace(fileText, Project, NewProject)
Set objFile = objFSO.OpenTextFile(scriptDirr + "\" + Solution + ".sln", ForWriting)
objFile.WriteLine(newFileText)
objFile.Close

' Rename the .csproj file'
objFso.MoveFile scriptDirr + "\" + Project + "\" + Project + ".csproj", scriptDirr + "\" + Project + "\" + NewProject + ".csproj"

' Rename the folder of the .csproj file'
objFso.MoveFolder scriptDirr + "\" + Project, scriptDirr + "\" + NewProject

1

注意:此修复程序适用于Visual Studio 2008,但应在此处运行。

  1. 使用Windows资源管理器,将解决方案文件夹(父文件夹和子文件夹)都重命名为新的解决方案名称。
  2. 删除.sln位于父文件夹中的文件。
  3. 在Visual Studio中,选择菜单“ 文件” ►“ 打开项目”
  4. 钻入刚刚重命名的新文件夹,然后打开.csproj文件(位于子文件夹中)。
  5. 右键单击项目名称,然后将其重命名为所需名称。(它应该与步骤1中的文件夹相同。)
  6. 选择菜单文件关闭解决方案。对话框将询问您是否要保存对.sln文件的更改。点击Yes
  7. 在“ 另存文件为”对话框中,指向新重命名的文件夹,然后单击“ 保存”。(注意:请确保该.sln文件与文件夹具有相同的名称。这不是必需的,但可以保持一致性。)

做完了


1

使用TFS时,步骤2实际上是在源代码管理中重命名文件夹,然后在重新打开解决方案之前获取最新版本。


1

我们最近上传了一个免费的Visual Studio扩展程序的Beta版,该扩展包可为您完成这些工作。

看看Visual Studio Gallery:Gallery下载


1

好吧,我做到了

  • 关闭Visual Studio 2012
  • 将子目录重命名为.sln下的首选名称
  • 删除* .suo文件
  • 再次打开解决方案,并修复加载的项目的任何属性以符合新的子目录名称

1
  1. 重命名解决方案和项目文件夹中的项目

  2. 从解决方案中删除项目

  3. 将现有项目添加到解决方案中(您的重命名项目)

这个对我有用。TFS还将跟踪新项目。


1

在文本编辑器中打开.sln,然后在下面的行中将<FolderName>更改为新的文件夹名称Project(“ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}”)=“ Ricky”,“ \ .csproj”,“ {021CC6B0-8CFB-4194-A103-C19AF869D965}”


3
请解释为什么/如何工作。
Simon.SA

1

转到.sln文件,右键单击,用Notepad ++(或任何编辑器; Notepad ++是最快的)打开,找到路径,然后更改它。



0

当必须创建一个新项目,并且您想要一个不同于项目名称的项目文件夹名称时,也会出现类似的问题。

创建新项目时,该项目将存储在

./path/to/pro/ject/YourProject/YourProject.**proj

假设您想将其直接放在ject文件夹中:

./path/to/pro/ject/YourProject.**proj

为此,我的解决方法是使用路径的最后一部分作为名称来创建项目,以便它不会创建其他目录:

./path/to/pro/ject/ject.**proj

现在,当您从Visual Studio中重命名项目时,无需离开Visual Studio就可以实现目标:

./path/to/pro/ject/YourProject.**proj

这种方法的缺点是,您还必须调整默认名称空间和Output二进制文件的名称,并且必须更新项目模板中包含的所有文件中的名称空间。


0

我使用Visual Studio 2013和TFS 2013。

我这样做是这样的:

  1. 打开Visual Studio,而不打开解决方案本身,并使用Source Control Explorer查找和重命名项目的文件夹
  2. 源代码管理资源管理器中双击解决方案文件以打开解决方案。
  3. 您会遇到一个问题:“项目最近已添加到此解决方案中。是否要从源代码管理中获取它们?” ,然后您选择Yes
  4. 现在有文件夹和项目结构,但是有文件,因此现在您可以从源代码管理中获取最新版本
  5. 尝试构建并提交更改。

所以没有Windows资源管理器的东西。最后,您可以删除所有本地文件,并从源代码管理中获取整个(干净的)项目。
Muris 2014年

我刚刚发现,由于文件夹重新排列,该解决方案文件还可以在存储某些项目的地方创建空文件夹。然后,在记事本中打开解决方案文件,并通过创建的空目录数量减少属性SccNumberOfProjects的数量,并删除相应的SccProjectUniqueName#,SccProjectName#,SccLocalPath#和其他具有相同#的属性。
米利斯(Muris)2014年

0

有一种更简单的方法已在Visual Studio 2013 Update 1中进行了测试,适用于与TFS连接的项目:

  • 打开Visual Studio,但让解决方案关闭。
  • 打开Source Explorer并重命名所需的文件夹(如果尚未首先关闭解决方案,则该解决方案将为您关闭)。
  • 右键单击解决方案(也从Source Explorer),然后选择签入。
  • 打开解决方案。您会被告知添加了新项目。接受以获取更改。
  • 从解决方案中删除该项目,然后再次添加它,然后签入。
  • 检查内部引用是否正确。

0

最简单的方法是转到窗口的属性,更改默认名称空间的名称,然后完成重命名。


您说的是什么窗户?您的意思是项目的属性窗口吗?
Peter Mortensen

0
  1. 在Visual Studio外部重命名项目。
  2. 使用文本编辑器编辑your_project_name.sln,然后将路径重命名为新路径。

1
这似乎与当前解决方案相似,但难度更高。
Bowlturner

0

我做了以下事情:

<创建整个文件夹的备份>

  1. 在Visual Studio 2013中重命名项目(可选/不需要)。

  2. 将项目导出为模板。

  3. 关闭解决方案。

  4. 重新打开解决方案

  5. 从保存的模板创建一个项目,然后使用您喜欢的名称。

  6. 从解决方案资源管理器中删除先前的项目。

在这一点上,我试图编译新的解决方案,并且这样做,我必须手动将一些资源和标头从旧项目文件夹复制到新项目文件夹中。这样做直到它编译没有错误为止。现在,这个新项目保存了“ .exe”文件到先前的文件夹中。*

所以->

  1. 转到Windows资源管理器,然后手动将解决方案文件从旧项目文件夹复制到新项目文件夹。

  2. 关闭解决方案,然后从新项目中打开解决方案。

  3. 如果需要,将配置更改回(x64)。

  4. 从解决方案的文件夹中删除旧名称的项目文件夹。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.