I want to avoid duplicating 400+ files in the Assets folder of my UWP App project folder. I want to tell VS to take files from an arbitrary location in my source tree, and use those in the Assets folder, preserving folder structure etc for deployment. I don't even mind setting the pathing manually in the project file properties if I must.
Is there a way to do this? The best I got was to right click on Assets\BlahFilter -> Add -> Existing Item. This results in the file appearing in the Solution treeview in the place I expect, but when deploying, the file appears in the root of AppX folder, ignoring any subfolder (filter) structure specified above.
I fixed this. You can use a "Custom Build Step" and treat the output as content. This will result in VS packaging that output directory's contents in the final AppX package. You can specify a folder, and all sub-folders will be automatically copied. The build command can be blank, or something innocuous like 'echo "blah"'
My Current Situation:
I had a solution in which I split a large MVC project into two smaller projects. Of course the two smaller projects reference the same JavaScript and content files that were in the old larger project.
What I wish to do:
Instead of duplicating the scripts and content in the 2 projects, I want to create a shared folder that the 2 project refer to using something like a link or a shortcut.
How I am trying to approach the problem:
I think that solution folders are the solution to my problem. So I want to create a solution folder to which I will move all my scripts and content files.
However, my problem is that I have to move file by file to this folder since we cannot simply add an existing folder (I moved the scripts and content folders to the solution directory itself instead of being inside a specific project). And this is so tedious.
Here is what I tried to do:
First I tried to locate where solution folders are created. However, I discovered that solution folders don't physically exist. I think they are just some kind of logical structuring to your solution. Whenever you add a file to a solution folder it is physically added to the solution directory.
I thought that the solution file (.sln) may contain the configuration of solution folders and their content in some kind of xml format. However, this doesn't seem to be the case.
I opened the SQL Server Compact Edition file (.sdf) of the solution thinking that may there is a DB table that describes the solution folders. However, this also doesn't seem to be the case.
So, finally, my question is:
Is there any easy way to add an existing folder as a solution folder in order to avoid adding files one by one (I have too many files).
Update:
Thanks for the answers and suggestions. I ended up taking a somewhat different approach. I used a pre-build command: XCOPY "$(SolutionDir)Files\*.*" "$(ProjectDir)" /E. I did this because the suggested solutions and my previous attempt was to add links/shortcuts to the external resource files. While this was fine and shortcuts were actually added to the project, when I tested the MVC project, IIS didn't manage to load the resource files since it looks for physical files (of course).
So my query now is: is there someway, whether a build event or and configuration in the csproj file, to "Include In Project" the newly "physically" copied files?
As drew advised: editing the project file is one way. Another way is to edit the Solution file in a mechanism similar to that of the csproj file.
In a solution file, a project with a specific GUID holds the details of a set of folders.
Write a small app that will read your folder and output a small text of the desired output. Generate new Guids until the file is created. Just paste this at the top of the .sln file. 2150E333-8FDC-42A3-9474-1A3956D46DE8 seems to be the GUID used for Solution Items.
This sample has a few subfolders with content in a nested structure.
i.e.
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NewFolder1", "NewFolder1", "{4CDFCC66-45BD-4B6D-8758-FEF7E9F61C1C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SubFolder1", "SubFolder1", "{771BDBFB-5C01-4C51-A170-D88ECA8DE896}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SubFolder2", "SubFolder2", "{5D23AB90-5EF6-4611-A575-34F7B50BB1B6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NewFolder2", "NewFolder2", "{135E9F67-2DF8-4458-AC6D-FF82FC1B3BC6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SubSubFolder1", "SubSubFolder1", "{B41C7BAA-7E3D-405B-96AB-005120D12D26}"
ProjectSection(SolutionItems) = preProject
NewFolder1\SubFolder1\SubSubFolder1\a.txt = NewFolder1\SubFolder1\SubSubFolder1\a.txt
EndProjectSection
EndProject
Solution folders (on the file system) are optional, and in Visual Studio they're typically used just to organise files within Visual Studio.
It's a manual approach to create a "physical" folder at the same level as the solution but this reduces complexity.
Below are the steps for moving a single script file:
On the File System
Create a solution folder (typically at top-level directory)
Copy script file from (one) project to solution folder
In Visual Studio
Create a solution folder
Right-click solution folder, select Add > Existing item...
Select script file from the new solution folder on file system, then click Add
Exclude/Remove script file from project1
Right-click project1, select Add > Existing item...
Select script file from solution folder on file system, select "Add as link" from the drop down on the Add button
Repeat steps 6-8 for all other projects
By using "Add as link" the main thing we've done is to add a reference to the script in the solution folder as opposed to the actual file being copied to the project folder.
Note that you're not limited to working with one file at a time, it's just easier to track.
The fastest way I know of to find where you solution folder is located:
Within Visual Studio, open the "Solution explorer if it's not already open View -> Other Windows -> Solution Explorer (CTRL + ALT + L)
Within the solution exploerer, Right-click your project or solution
Select Add -> New Item.
The window that pops up will allow you to select a new file template, but what you're looking for is the "Location" field at the bottom. It should have the path to your solution folder. It's a safe bet that your solution folder is at this location or up a couple levels.
Once you get the path to your solution folder you can click Cancel to exit the wizard.
As far as I can tell, visual studio doesn't provide this feature through their interface. The intention probably is that project files exist within the project folder rather than being separate. It generally makes working with projects easier (moving, sharing, etc).
That said, you don't have to have every real folder in a project location actually included in that project. So you could do something like the following folder structure:
+ /Projects (contains ProjectA.csproj and ProjectB.csproj)
|
+-- /ProjectA (folder with files that are just for "ProjectA"
|
+-- /ProjectB (folder with files just for "ProjectB")
|
+-- /Shared (Folder with your shared scripts/files)
With this structure you should be able to use the "Show All Files" button and include the shared folder in both projects. You will probably need to manually edit the csproj files to map to this new structure but it shouldn't be too difficult.
The only other option I can think of is to try to manually edit the csproj files such as this question shows.
Hope that all helps. Best of luck!
My final solution to the problem is a combination of the solutions suggested answers and the approach I decided to take so that local IIS can see the files.
I added the following section to the csproj file:
<Content Include="..\Files\**">
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
</Content>
I also added the following command as a pre-build event in my project:XCOPY /y "$(SolutionDir)Files\*.*" "$(ProjectDir)" /E
Hi
In order to be able to work with e.g. picture, I need to click on Resources.resx and Add Existing Item.
Then it will appear under Resources folder. However I could use Context menu on that Resource folder and add existing item as well but then I cannot work with it and it is not displayed when I use the Resources.resx file.
So I always need to click on Resources.rext when I want to add anything? Also in this "view" I cannot use folders so its pretty messy.
Also what is New Folder in Resources dir good for - when I drag files there, there are not accessible anymore..
Correct; to add something to a ResX file, you need to add it to the ResX file.
Instead of folders, you can use multiple ResX files.
You can also embed images in your assembly (set Build Action to Embedded Resource) instead of using ResX files; you can then create arbitrary directory trees.
To read embedded resources, call typeof(MyType).Assembly.GetManifestResourceStream(name) and remember to close the stream in a using statement.
I have a static site of html and css files. It has folders on my computers. I see an 'add files' option in Source Safe 8 but it only copies files from the root folder.
How can I get Source Safe to copy the whole folder tree structure and their files?
To copy the entire directory tree, create the root folder ("Create Project") in visual source safe. Then from Windows Explorer select all files and folders you want to add to this new project (folder).
It should prompt you for a comment. Enter your note and click ok. That should add all files and folders.
If you only need to add a folder, drag the folder in to it's root in VSS. It will create the folder in VSS.
I think VSS always calls folders "projects".
Yes, drag and drop the folder, check the recursive box at the bottom where you add your comment for the initial check in. This copy all subfolders and files.
I completely agree with the suggestion of using a better option, however if Source Safe is what you use I believe its in the menus as "Create Project" to manually create folders.
Its been a bit since I've used Source Safe, but IIRC, you should be able to just drag and drop a directory into your Source Safe project and the entire tree will be added.
just drag and drop the folder from explorer into the folder in sourcesafe.
I have a Visual Studio Solution. Currently, it is an empty solution (=no projects) and I have added a few solution folders.
Solution Folders only seem to be "virtual folders", because they are not really created in the Filesystem and files inside solution folders are just sitting in the same folder as the .sln file.
Is there a setting that i've overlooked that tells Visual Studio to treat Solution Folders as "real" folders, that is to create them in the file system and move files into it when I move them inside the solution into one of those folders?
Edit: Thanks. Going to make a suggestion for VS2010 then :)
There is a workaround, that actually behaves as expected.
Add a New or Existing Web Site to the Solution. (I usually create a new one.)
Just make sure it's created inside your solution folder. (I sometimes even create a "link" to an external folder, e.g. 'Docs' or 'Marketing' on a network share. In that case it's ignored by Git of course.)
Make sure to go to the "Project" settings or Configuration Manager to exclude this "Web Site" from Build and Deploy!
Done. Now Solution Explorer will reflect any change in the file system and vice versa (including subfolders).
I (miss)use it for specs, docs, PM and some DevOps scripts that are shared within the team. It's easy to choose, what to include in source control or not, and (if set up correctly) it doesn't conflict with build.
I know the feature is not intended for that use case, but except for the maybe misleading "Project" icon I didn't find any shortages to that hack yet. And there still are use cases where the classical (virtual) Solution Folders that VS provides, fit in the picture. What do you think?
No special setting. I don't think it's supported.
You can create real folders in a "project" within the solution, but not in the solution itself.
In Visual Studio 2017, click on the "Solutions and Folders" icon in the Solution Explorer window. This button toggles from the virtual "solution" view into a "source view" that matches the layout of folders and files on the file system. When you add a new folder, the folder is physically created in the expected location.
.
The chosen answer suggests it would be possible to use actual projects instead of solution folders, but does not really explain how. I guess what I'm describing here is possibly the least awkward way of achieving that... :-P
The problem with regular project files is that they eventually will be compiled by MSBUILD. And if you want have a project which only contains non-compilable files, that will be an issue.
But some time ago Visual Studio introduced a new project type: Shared Project (.shproj extension). This project type does not get compiled by default, but only when (and only if) it is referenced by another project.
So one part of the trick here is to use shared projects instead of solution folders. It's obviously possible to add a shared project that is never referenced by any other project, meaning we can avoid the issue presented above.
Then, by using <None Include="**/*" /> clause in the .shproj file, we can make it automatically reflect any new files and/or subfolders.
So basically do this:
Create a new folder in your solution.
Add a new .shproj file at the root of this new folder.
Reference the new .shproj in your solution.
For instance, in my case, I've created a DockerDev.shproj, so I can group some docker-related scripts that we run only in our development machines:
<?xml version="1.0" encoding="utf-8"?>
<!-- DockerDev/DockerDev.shproj -->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="**/*" />
</ItemGroup>
</Project>
This .shproj file will keep track of any file, in any subfolder of this new DockerDev folder in my solution.
As far as I could see, this solution works pretty much like what the OP requested: it will work as a non-compilable reference to a folder, and it will automatically reflect any changes made to it.
Sara Ford contributed a Macro to add do this. In Visual Studio 2010, if you open your Macro Explorer, you will see a macro called "GenerateSlnFolderOnDirStructure." This will automate the creation of the Solution Folders and add the files.
Folder To Solution Folder By Cecilia Wirén - CeciliaSHARP
Remove the hassle of adding several files to solution folder. Just use the context menu for the solution and just below the option of creating a new solution folder you now find 'Add Folder as Solution Folder'. This will create a solution folder with the same name as you selected and add the items inside of that folder to the solution folder. This will not move the files on disk.
You can just sync your new solution folder nesting level and also name with the actual filesystem folder and it works like a charm!
Existing project :
Create the actual folder
Create the solution folder with the exact same name
Copy your project folder into the new folder (Actual file system)
(in solution explorer) - Righ-click on same folder
Add => Existing project
Add new project :
Create your solution folders
(Right-click on solution) => Add new project
Change the Location address under the project name you want to add, to the exact same address in your solution folders
No, it's not supported. As you suspected, solution folders are simply virtual subentries in the .sln file, nothing to do with the file system.
For C# in Visual Studio 2019 I used this way (Seems to be similar to this answer, but that didn't work at least in C# solutions)
In solution explorer click on switch views
Choose folder view
You can add individual folders to the solution
To get back to the regular view of solution explorer just click switch views again and choose the solution.
There seems to be a limitation using this way (comment from #montonero):
... just open a solution with multiple projects and try to move the projects to some other real folders through the folder view. The issue is VS doesn't update paths to projects in a solution file
Visual studio has no support for this. I made an extension that does something similar for VS2013 though. It maps solution folders to physical folders on your hard drive, though the mapping is one way (from hard drive to solution). That means a solution folder's contents will reflect the hard drive folder's contents, and not the other way.
With that out of the way, the extension may still be useful.
It has support for mapping solution folders to physical folders, filtering files and directories based on regex, and remembering mappings in your .sln file. Properties are non-intrusive so developers without the extension can still open the sln and not be affected.
Hosted on visual studio gallery:
https://visualstudiogallery.msdn.microsoft.com/69e19ea6-4442-4cb6-b300-044dd21f02bd
Edit: Uploaded to bitbucket. Now open source. MIT license. https://bitbucket.org/LSS_NorthWind/physical-solution-folders
Create "Solution folder". This will create logical folder, but not physical one.
Right click to the solution folder and open a new project dialog. But before you click OK, you have to change a project location to your desired physical folder and VS will create it and place the project inside.
Create an empty solution then
open .sln file in an editor
and put these lines of code after MinimumVisualStudioVersion
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9D8C3BB1-AEDB-4757-8559-995D12A4E6D0}"
open the solution in vs and you should add the same folder to it
now you can see the folder and add a project to it
you have a real folder in windows and a virtual one in vs
be sure that you
created the projects with that path
You can add real folders by choosing "Add new filter" for a Visual Studio project file. You can also do "Add new filter" under an existing folder. Once the folder is created, rename it and add source or header file or whichever suits your project. This is one way I know which lets us create real folders through the Visual Studio IDE.
I've wanted this feature a few times myself, but at the end of the day, you really do NOT want the ability to do this. Think of your Solution (file) as as the root of a web application and think of Solution folders as Virtual Directories (literally and functionally). The contents of a web virtual directory could be physically on a different server altogether. Where Visual Studio muddled up the solution folders concept is by allowing you to create new files inside the folder. You should always "Add Existing" when adding content. When you add existing, it creates a link to the source location of the file.
But as for the reason you do not want solution folders to behave like "physical" folders is because your solution layout may not necessarily use the same convention as your source control layout. Solution folders allow you to customize the hierarchy of your projects so that you can group projects and items together any way you like, and then decide you don't like it and change it again without having to go through the nightmare of moving source control items around and irritating the rest of your team.
Note: Yes this is possible you can create a folder on root but its lil bit tricky....
By giving some extra efforts you can do it How?
Lets follow the step--
1-Create Folder eg: "newfolder" on root (where your .sln file reside).
2.Copy and paste your projects inside the folder.
3.go to your sln file and find moved projects and append newfolder\ in moved project's address.
4.Save sln file.
5.Open your project and Commit the repository in git or so...
6.Take the repository on fresh location.
YOU are done...
if still you are not able to see your folder -----
1.Add a solution folder xyz.
2.Open sln file and change that folder name with your folder name.
Congrats you are done..
If you face any problem just write me for help..
The folder created underneath the solution will be virtual as said. Maybe this might be called a workaround but you can physically create the folder on disk either before or when you add new item/project and Robert should be a sibling of your dad.
ps- on closer look maybe i should explain "bob's your uncle" means your fine/sorted.
I have a bit of a workaround for this (it's not great, but it works).
Create a folder in your solution (i.e. "Contoso")
Right click on the solution and then click "Open Folder in Solution Explorer"
Create the physical folder (i.e. "Contoso") in the solution directory
Copy/Create files in the physical folder.
Drag the files into the virtual folder in the solution explorer.
It's not great because you will need to manually maintain the file references, but it works for me.
Yes, it is possible in Visual Studio 2019 for the project
Though this is an old topic, I will add my answer, because I had the same issue and searched for a solution but it seemed that everyone is 100% sure that there is no way to do it. So I started to experiment with VS 2019, tried a lot of settings, and eventually figured the way out.
1 Button :D
You only need to click 1 button - Show All Files, and you will see the physical structure of your Visual Studio Solution:
Now you can add files and folders to the project and they will be added to the file system (physically)
Right-click on your project → Add → New Folder
Note that the option changed from New Filter to New Folder
My recommendation for C++
Create a root folder inside your project's directory which will contain all the application related stuff (code, headers, data, libs... ). I name it Project
Add subfolders as you'd like to structure your code. I prefer the following layout: include, src, data, libs, etc
Now setup Visual Studio to recognize these folders as headers and sources directories.
Click on your project in the Solution Explorer. Note, in my case, it is CrazyDemo, not the Solution 'CreazyDemo' (1 of 1 project)
Go to the project properties menu: Project→Properties
Open Configuration Properties→VC++ Directories tab
Edit Include Directories and set to $(ProjectDir)/Project/include;$(IncludePath)
Edit Library Directories and set to $(ProjectDir)/Project/libs;$(LibraryPath)
Edit Source Directories and set to $(ProjectDir)/Project/src;$(SourcePath)
You may use the Scope to This option if you want to focus on 1 project. Just right-click on the Project folder and press Scope to This
Note that after this action, in order to open Project Properties you need to click on any of your project files (like main.cpp in the example) and then click on the editable client area (like when you want to change the code) and only after that you'll be able to see the Project→CrazyDemo Properties option. [Visual Studio is Insane 🤦♂️]
Finally, you may have a project like this