Se il percorso dove sono i file è fuori dal sito l'unico modo è leggere uno stream da disco andando a puntarlo direttamente,
in C# una cosa del genere:
Questo metodo ritorna un'array di byte che sono il contenuto del file.
Come vedi al metodo devi passare il percorso completo del file da leggere (quindi d:\path\file.pdf per esempio)

codice:
		//Metodo che permette di effettuare il download
		public static byte[] DownloadFile(System.String m_strFilePath) 
		{

			//Dichiarazione membri interni
			System.Byte[] m_byteFile = null;
			System.IO.FileStream m_StaticFileStream = null;
			
			try 
			{
				//Recupero i byte del file leggendolo da uno stream
				m_StaticFileStream = new FileStream(m_strFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
				m_byteFile = new byte[m_StaticFileStream.Length];
				m_StaticFileStream.Read(m_byteFile, 0, m_byteFile.Length);
				m_StaticFileStream.Close();

				//Chiamo le funzionalità per forzare il download
				if (m_byteFile.Length > 0) 
				{
					return m_byteFile;
				} 
				else 
				{
					//Rilancio eccezione
					throw new Exception("File non trovato.");
				}

			} 
			catch 
			{
				//Rilancio eccezione
				throw;
			}
			finally 
			{
				//Stacco oggetto
				m_StaticFileStream = null;
			}
		}

Queti byte li devi leggere da una pagina apposita tipo download.aspx a cui passerai i riferimenti del file.
In questa pagina dovrai forzare gli header http per fare il download

codice:
					//Recupero i dati per il download
					m_byteFile = Global.Common.FileSystem.FileOperation.DownloadFile(this.FilePath);

					//Clear del contesto
					HttpContext.Current.Response.Clear();
				
					//Imposto l'header
					HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename="+this.FileName.ToString());
					HttpContext.Current.Response.AddHeader("Pragma", "public");
					HttpContext.Current.Response.AddHeader("Cache-Control","max-age=0");
					HttpContext.Current.Response.AddHeader("Content-Length", m_byteFile.Length.ToString());
					HttpContext.Current.Response.ContentType = "application/save; name=" + this.FileName;

					//Scrittura dei Byte
					HttpContext.Current.Response.BinaryWrite(m_byteFile);					
					HttpContext.Current.Response.Flush();
					HttpContext.Current.Response.End();